CountDownLatch

mac2025-06-21  9

概念:CountDownLatch是通过一个计数器,记录线程的数量,每个线程在完成自己的任务之后,调用countDown方法,将计数器减一,当计数器的值将为0时,原来等待的线程,即调用countDownLatch.await()方法线程将会被唤起,继续执行。这里有个主线程,调用countDownLatch.await()方法的线程,它会处于挂起状态,直到所有的线程都执行完countDownLatch.countDown方法,最终将计数器减为0,才会被唤醒继续执行。  

package IO; import java.util.concurrent.CountDownLatch; /** * @author 犀角 * @date 2019/11/1 14:15 * @description */ class Driver{ void main() throws InterruptedException { int N = 5; CountDownLatch startSignal = new CountDownLatch(1); CountDownLatch doneSignal = new CountDownLatch(N); //让工人们开始动起来 for (int i = 0;i <N;++i){ new Thread(new Worker(startSignal,doneSignal)).start(); } // 当前main线程先睡眠一段时间,做些其他的事情 Thread.sleep(3000); // 唤醒工人们,开始干活 startSignal.countDown(); // 司机再去做一些其他事情 Thread.sleep(3000); // 等待工人们结束工作后,再司机开始执行 doneSignal.await(); System.out.println(Thread.currentThread().getName() + "司机开始"); } } class Worker implements Runnable{ private final CountDownLatch startSignal; private final CountDownLatch doneSignal; Worker(CountDownLatch startSignal,CountDownLatch downLatch){ this.startSignal = startSignal; this.doneSignal = downLatch; } @Override public void run() { System.out.println(Thread.currentThread().getName() + "工人开始准备干活"); try { startSignal.await(); System.out.println(Thread.currentThread().getName() + "工人正在干活。。。"); doneSignal.countDown(); System.out.println(Thread.currentThread().getName() +"干完活了!"); } catch (InterruptedException e) { e.printStackTrace(); } } } public class CountDownLatchTest2 { public static void main(String[] args) throws InterruptedException { Driver driver = new Driver(); driver.main(); } }

 

最新回复(0)