利用CountDownLatch闭锁实现。
CountDownLatch可以使一个或多个线程等待一组事件的发生,闭锁状态包含一个计数器,该计数器被初始化为一个正数,表示需要等待事件的数量。
发挥主要作用的两个方法分别是:
countDown(); 递减计数器,表示一个事件已经发生了;
await(); 等待计数器达到零,如果计数器的值非零,那么await会一直阻塞直到计数器为零,或等待中的线程中断,或等待超时。
public class TimeTest{ public void cyclic() { for(int i=0;i < 100;i++) { System.out.println(Thread.currentThread().getId() + "---" + i); } } public static void main(String[] args) throws InterruptedException { int nThread = 100; final CountDownLatch endGate = new CountDownLatch(nThread); TimeTest timeTest = new TimeTest(); for(int i=0;i<nThread;i++){ Thread t = new Thread(() -> { try { timeTest.cyclic(); }finally { endGate.countDown(); } }); t.start(); } endGate.await(); System.out.println("线程执行完成"); } }另外,我们还可以利用CountDownLatch来计算多线程执行一个任务需要的时间。
public class TimeTest{ //待测试方法 public void cyclic() { for(int i=0;i < 100;i++) { System.out.println(Thread.currentThread().getId() + "---" + i); } } public static void main(String[] args) throws InterruptedException { int nThread = 100; final CountDownLatch startGate = new CountDownLatch(1); final CountDownLatch endGate = new CountDownLatch(nThread); TimeTest timeTest = new TimeTest(); for(int i = 0;i < nThread;i++){ Thread t = new Thread(() -> { try { startGate.await(); try { timeTest.cyclic(); }finally{ endGate.countDown(); } } catch (InterruptedException ignored) { } }); t.start(); } long start = System.nanoTime(); startGate.countDown(); endGate.await(); long end = System.nanoTime(); System.out.println("耗时:" + (end-start)); }