CountDownLatch的使用
- - 编程语言 - ITeye博客 CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则处于等待状态,调用countDown()方法就将计数器减1,当计数到达0时,则所有等待者或单个等待者开始执行. ExecutorService service = Executors.newCachedThreadPool(); //创建一个线程池.
CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则处于等待状态,调用countDown()方法就将计数器减1,当计数到达0时,则所有等待者或单个等待者开始执行。
public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); //创建一个线程池 final CountDownLatch cdOrder = new CountDownLatch(1); //state值为1 final CountDownLatch cdAnswer = new CountDownLatch(3); //state值为3 for(int i=0;i<3;i++){ Runnable runnable = new Runnable(){ public void run(){ try { System.out.println(""线程"" + Thread.currentThread().getName() + ""正准备接受命令""); cdOrder.await(); //等待直到cdOrder的state值为0时,继续往下执行 System.out.println(""线程"" + Thread.currentThread().getName() + ""已接受命令""); TimeUnit.SECONDS.sleep(3); //线程休眠3秒 System.out.println(""线程"" + Thread.currentThread().getName() + ""回应命令处理结果""); cdAnswer.countDown(); //cdAnswer的state值减1 } catch (Exception e) { e.printStackTrace(); } } }; service.execute(runnable); //为线程池添加任务 } try { TimeUnit.SECONDS.sleep(5); //线程休眠5秒 System.out.println(""线程"" + Thread.currentThread().getName() + ""即将发布命令""); cdOrder.countDown(); //cdOrder的state值减1 System.out.println(""线程"" + Thread.currentThread().getName() + ""已发送命令,正在等待结果""); cdAnswer.await(); //等待直到cdAnswer的state值为0时,继续往下执行 System.out.println(""线程"" + Thread.currentThread().getName() + ""已收到所有响应结果""); } catch (Exception e) { e.printStackTrace(); } service.shutdown(); //任务结束,停止线程池的所有线程 }