CountDownLatch的使用说明
CountDownLatch的使用说明
CountDownLatch这个类正如名字所表达的意思,倒计时锁。它允许一个或多个线程等待直到这个锁倒计时完毕。
一个CountDownLatch用给定的数字进行初始化,这个数字可以看成是倒计时的时长。await方法会阻塞线程,直到由于countDown()方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的线程调用await方法,都会被立即返回,表示已经没有锁了。 这个倒计时锁是一次性的,计数无法重置。 如果想要可以重置计数的版本,请考虑使用CyclicBarrier 。
CountDownLatch是一种通用的同步工具,可用于多种用途。 例如控制多个线程同时执行。又或者让所有线程都执行完毕后,才执行后续的代码。
构造方法
CountDownLatch只有一个构造方法,这个构造方法传入一个整数,这个整数就是倒计时的计数。
常用方法
await,这个方法用于阻塞线程。这个方法进行了重载,一个方法是空参的,一个是带过期时间参数的。这个方法只有三个情况下才会返回true,如下所示:
- 记数变成0
- 线程被中断
- 过期(这个情况只在有过期的方法才生效)
countDown方法用于减少计数,每次减一。
getCount方法用于返回当前的计数。
使用示例
package com.wangguitang.freedom.interview.java.concurrent;
import org.junit.jupiter.api.Test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 倒计时锁的测试
*
* @author freedom wang
* @date 2021-04-07 23:18:33
*/
public class CountDownLatchTest {
/**
* 模拟多个线程同时执行的场景
*
* @author freedom wang
* @date 2021-04-07 23:32:28
*/
@Test
public void test1(){
ExecutorService executorService = Executors.newCachedThreadPool();
CountDownLatch countDownLatch = new CountDownLatch(1);
for (int i = 0; i < 10; i++) {
executorService.submit(()->{
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(System.currentTimeMillis());
});
}
countDownLatch.countDown();
}
/**
* 模拟所有线程执行完成后执行的场景
*
* @author freedom wang
* @date 2021-04-07 23:40:15
*/
@Test
public void test2(){
int threadCount = 10;
ExecutorService executorService = Executors.newCachedThreadPool();
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
executorService.submit(()->{
System.out.println("执行线程逻辑");
countDownLatch.countDown();
});
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("所有线程执行完后执行");
}
}
本文详细介绍了Java并发工具类CountDownLatch的使用,包括其构造方法、常用方法如await和countDown,以及如何通过示例应用在多线程同步场景中。CountDownLatch作为一次性门闩,允许线程等待直至计数归零,常用于控制多个线程同时开始执行或确保所有线程执行完毕后再执行后续操作。
514

被折叠的 条评论
为什么被折叠?



