CountDownLatch是一个同步辅助类,它允许一个或多个线程一直等待直到其他线程执行完毕才开始执行。用给定的计数初始化CountDownLatch,其含义是要被等待执行完的线程个数。每次调用countDown(),计数减1。主程序执行到await()函数会阻塞等待线程的执行,直到计数为0。
package com.zhi.test; import java.util.Random; import java.util.concurrent.CountDownLatch; import org.junit.Test; /** * CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行 * * @author zhi * @since 2019年1月16日09:22:34 * */ public class CountDownLatchTest { @Test public void test() { final int jobCount = 5; CountDownLatch latch = new CountDownLatch(jobCount); for (int i = 1; i <= jobCount; i++) { new Thread(new Job(latch, i)).start(); } try { latch.await(); System.out.println("所有线程已执行完成!"); } catch (InterruptedException e) { e.printStackTrace(); } } } class Job implements Runnable { private CountDownLatch latch; private final int id; public Job(CountDownLatch latch, int id) { this.latch = latch; this.id = id; } @Override public void run() { try { Thread.sleep(new Random().nextInt(10) * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("任务" + id + "执行完成"); latch.countDown(); } }
执行结果:
任务3执行完成
任务4执行完成
任务2执行完成
任务1执行完成
任务5执行完成
所有线程已执行完成!