CountdownLatch 类分析

来源:互联网 发布:朴宰范 私生活问题知乎 编辑:程序博客网 时间:2024/06/01 11:32

之前看过一个视频,讲的主要是如何通过多线程模拟高并发访问。当时还没接触CountdownLatch这个类,之前有了解过进程间的通信方式,例如信号量、消息队列等。这篇文章主要研究 CountdownLatch 这个类的基本用法,以及如何实现多个线程同时运行。


CountdownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,他允许一个或多个线程一直等待。

主要方法

public CountDownLatch(int count);public void countDown();public void await() throws InterruptException

CountDownLatch构造方法中的 count 参数指定了技术的次数。

countDown()方法,当前线程调用此方法,则计数减一

await() 方法,调用此方法会一直阻塞当前线程,知道计时器的值为0

package countdownlatch;import java.util.concurrent.CountDownLatch;public class demo1 {private static void runDAfterABC() {int worker = 3;CountDownLatch countDownLatch = new CountDownLatch(worker);new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("D is waiting for other three threads");try {countDownLatch.await();System.out.println("All done, D starts working");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();for (char threadName = 'A'; threadName <= 'C'; threadName++) {final String tN = String.valueOf(threadName);new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println(tN+"  is working");try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(tN+"  finished");countDownLatch.countDown();}}).start();}}public static void main(String[] args) {runDAfterABC();}}

执行结果

D is waiting for other three threadsA  is workingB  is workingC  is workingA  finishedC  finishedB  finishedAll done, D starts working

执行过程:

  1. 首先,创建一个计数器,设置 count 的初始值,程序中的数值设置为3;
  2. 在执行了线程 D 之后,调用 countDownLatch.await()方法,将会进入阻塞状态,知道 countDownLatch 的 count 参数值为0;
  3. 在其他线程里,调用 countDownLatch.countDown() 方法,调用该方法会将计数值 减 1;
  4. 当其他线程中的 countDown() 方法把计数值变成 0 时,等待线程里的 countDownLatch.await() 立即退出,执行下面的代码



原创粉丝点击