package com.yd.wmsc.util; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.CountDownLatch; public class CountDownLatchDemo { final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) throws InterruptedException { CountDownLatch latch=new CountDownLatch(2);//两个工人的协作 Worker worker1=new Worker("zhang san", 5000, latch); Worker worker2=new Worker("li si", 8000, latch); worker1.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(latch)); worker2.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler(latch)); worker1.start(); worker2.start(); latch.await();//等待所有工人完成工作 System.out.println("all work done at "+sdf.format(new Date())); } static class Worker extends Thread{ String workerName; int workTime; CountDownLatch latch; public Worker(String workerName ,int workTime ,CountDownLatch latch){ this.workerName=workerName; this.workTime=workTime; this.latch=latch; } public void run(){ System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date())); doWork();//工作了 System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date())); latch.countDown();//工人完成工作,计数器减一 } private void doWork(){ System.out.println(String.valueOf(null)); try { Thread.sleep(workTime); } catch (InterruptedException e) { e.printStackTrace(); } } } }
package com.yd.wmsc.util; import java.util.concurrent.CountDownLatch; import org.apache.log4j.Logger; public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{ private static final Logger logger = Logger.getLogger(MyUncaughtExceptionHandler.class); private CountDownLatch latch; public MyUncaughtExceptionHandler(CountDownLatch latch){ this.latch = latch; } @Override public void uncaughtException(Thread t, Throwable e) { logger.error("An exception has been captured,Thread:" + t.getId() + ",ThreadName:" + t.getName() + ",Thread status:" + t.getState(), e); latch.countDown(); } }
线程池
setDefaultUncaughtExceptionHandler不是setUncaughtExceptionHandler
package com.yd.wmsc.util; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.CompletionService; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorCompletionService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; public class CountDownLatchDemo { final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @SuppressWarnings("static-access") public static void main(String[] args) throws InterruptedException { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext1.xml"); ThreadPoolTaskExecutor taskExecutor = (ThreadPoolTaskExecutor) ctx.getBean("taskExecutor"); long time1=System.currentTimeMillis(); CountDownLatch latch=new CountDownLatch(10);//两个工人的协作 for (int i = 0; i < 10; i++) { Worker worker = new Worker(String.valueOf(i),1000,latch); worker.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler(latch)); taskExecutor.execute(worker); } latch.await();//等待所有工人完成工作 System.out.println("all work done at "+sdf.format(new Date())); } static class Worker extends Thread{ String workerName; int workTime; CountDownLatch latch; public Worker(String workerName ,int workTime ,CountDownLatch latch){ this.workerName=workerName; this.workTime=workTime; this.latch=latch; } public void run(){ //System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date())); doWork();//工作了 //System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date())); latch.countDown();//工人完成工作,计数器减一 } private void doWork(){ //System.out.println(String.valueOf(null)); throw new ThreadDeath(); /* try { Thread.sleep(workTime); } catch (InterruptedException e) { e.printStackTrace(); } */ } } }