CountDownLatch 简介
CountDownLatch 是一个同步工具,允许一个或多个线程 等待其他线程(一个或多个线程)完成一组操做。
CountDownLatch 中的方法不多:
public CountDownLatch(int count) | 构造方法 | count 是同步计数的初始值 |
public void countDown() |
递减count值 | 递减计数器,每次减1,当count为0时,释放所有堵塞线程 |
public boolean await(long timeout, TimeUnit unit) | 堵塞线程 |
堵塞当前线程,直到count计数为0。 该方法有返回值:true 计数器=0, false 计数器>0 timeout:超时时间,当超过这个时间,将不再等待其他线程(不再堵塞当前线程) TimeUnit:等待时间的单为 |
public void await() | 堵塞线程 | 堵塞当前线程,直到count计数为0。 |
public long getCount() | 获取当前count计数 |
例子:老板雇佣了10个工人,当10个工人都工作完后,通知老板来检查,然后发工资
先看执行结果:
老板分配工作 工人0:工作用了8分钟 工人5:工作用了8分钟 工人6:工作用了5分钟 工人4:工作用了5分钟 工人1:工作用了7分钟 工人3:工作用了6分钟 工人2:工作用了8分钟 工人8:工作用了8分钟 老板去吃饭,一会查看工作 工人7:工作用了7分钟 工人9:工作用了8分钟 工人4: 干完活 工人6: 干完活 工人3: 干完活 工人1: 干完活 工人7: 干完活 工人0: 干完活 工人2: 干完活 工人9: 干完活 工人5: 干完活 工人8: 干完活 老板发工资了!!!!
示例代码:
public class CountdownLatchTest1 { public static void main(String[] args) { // 雇佣人数 int workCount = 10; CountDownLatch countDownLatch = new CountDownLatch(workCount); System.out.println("老板分配工作"); for (int i = 0; i < workCount; i++) { Thread thread = new Thread("工人" + i) { @Override public void run() { workTime(); System.out.println(Thread.currentThread().getName() + ": 干完活"); countDownLatch.countDown(); } }; // 开始工作 thread.start(); } try { System.out.println("老板去吃饭,一会查看工作"); // 等待其他工人工作完 countDownLatch.await(); // 通知老板发工资 money(); } catch (InterruptedException e) { e.printStackTrace(); } } /** * 随机计算工人的工作时间 */ public static void workTime() { try { int sleep = (int) (5 + Math.random() * (5 - 1 + 1)); System.out.println(Thread.currentThread().getName() + ":工作用了" + sleep + "分钟"); TimeUnit.SECONDS.sleep(sleep); } catch (InterruptedException e) { e.printStackTrace(); } } /** * 发工资 */ public static void money() { System.out.println("老板发工资了!!!!"); } }