没有合适的资源?快使用搜索试试~ 我知道了~
java并发工具类(CountDownLatch+Semaphore+Exchanger)
需积分: 0 1 下载量 200 浏览量
2023-06-20
14:22:02
上传
评论
收藏 39KB DOCX 举报
温馨提示
试读
13页
java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+Semaphore+Exchanger);
资源推荐
资源详情
资源评论
java 并发工具类
1. 倒计时器 CountDownLatch
在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主
线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用 Thread
类的 join 方法,让主线程等待被 join 的线程执行完之后,主线程才能继续往下
执行。当然,使用线程间消息通信机制也可以完成。其实,java 并发工具类中
为我们提供了类似“倒计时”这样的工具类,可以十分方便的完成所说的这种业务
场景。
为了能够理解 CountDownLatch,举一个很通俗的例子,运动员进行跑步比赛时,
假设有 6 个运动员参与比赛,裁判员在终点会为这 6 个运动员分别计时,可以
想象没当一个运动员到达终点的时候,对于裁判员来说就少了一个计时任务。直
到所有运动员都到达终点了,裁判员的任务也才完成。这 6 个运动员可以类比
成 6 个线程,当线程调用 CountDownLatch.countDown 方法时就会对计数器的
值减一,直到计数器的值为 0 的时候,裁判员(调用 await 方法的线程)才能
继续往下执行。
下面来看些 CountDownLatch 的一些重要方法。
先从 CountDownLatch 的构造方法看起:
java
复制代码
public CountDownLatch(int count)
构造方法会传入一个整型数 N,之后调用 CountDownLatch 的 countDown 方法
会对 N 减一,知道 N 减到 0 的时候,当前调用 await 方法的线程继续执行。
CountDownLatch 的方法不是很多,将它们一个个列举出来:
1. await() throws InterruptedException:调用该方法的线程等到构造方法传入的 N 减
到 0 的时候,才能继续往下执行;
2. await(long timeout, TimeUnit unit):与上面的 await 方法功能一致,只不过这里有了
时间限制,调用该方法的线程等到指定的 timeout 时间后,不管 N 是否减至为 0,
都会继续往下执行;
3. countDown():使 CountDownLatch 初始值 N 减 1;
4. long getCount():获取当前 CountDownLatch 维护的值;
下面用一个具体的例子来说明 CountDownLatch 的具体用法:
public class CountDownLatchDemo {
private static CountDownLatch startSignal = new CountDownLatch(1);
//用来表示裁判员需要维护的是 6 个运动员
private static CountDownLatch endSignal = new CountDownLatch(6);
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(6);
for (int i = 0; i < 6; i++) {
executorService.execute(() -> {
try {
System.out.println(Thread.currentThread().getName() + " 运动员等待裁判
员响哨!!!");
startSignal.await();
System.out.println(Thread.currentThread().getName() + "正在全力冲刺");
endSignal.countDown();
System.out.println(Thread.currentThread().getName() + " 到达终点");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
System.out.println("裁判员发号施令啦!!!");
startSignal.countDown();
endSignal.await();
System.out.println("所有运动员到达终点,比赛结束!");
executorService.shutdown();
}
}
输出结果:
pool-1-thread-2 运动员等待裁判员响哨!!!
pool-1-thread-3 运动员等待裁判员响哨!!!
pool-1-thread-1 运动员等待裁判员响哨!!!
pool-1-thread-4 运动员等待裁判员响哨!!!
pool-1-thread-5 运动员等待裁判员响哨!!!
pool-1-thread-6 运动员等待裁判员响哨!!!
裁判员发号施令啦!!!
pool-1-thread-2 正在全力冲刺
pool-1-thread-2 到达终点
pool-1-thread-3 正在全力冲刺
pool-1-thread-3 到达终点
pool-1-thread-1 正在全力冲刺
pool-1-thread-1 到达终点
pool-1-thread-4 正在全力冲刺
pool-1-thread-4 到达终点
pool-1-thread-5 正在全力冲刺
pool-1-thread-5 到达终点
pool-1-thread-6 正在全力冲刺
pool-1-thread-6 到达终点
所有运动员到达终点,比赛结束!
pool-1-thread-2 运动员等待裁判员响哨!!!
pool-1-thread-3 运动员等待裁判员响哨!!!
pool-1-thread-1 运动员等待裁判员响哨!!!
pool-1-thread-4 运动员等待裁判员响哨!!!
pool-1-thread-5 运动员等待裁判员响哨!!!
pool-1-thread-6 运动员等待裁判员响哨!!!
裁判员发号施令啦!!!
pool-1-thread-2 正在全力冲刺
pool-1-thread-2 到达终点
pool-1-thread-3 正在全力冲刺
pool-1-thread-3 到达终点
pool-1-thread-1 正在全力冲刺
pool-1-thread-1 到达终点
pool-1-thread-4 正在全力冲刺
pool-1-thread-4 到达终点
pool-1-thread-5 正在全力冲刺
pool-1-thread-5 到达终点
pool-1-thread-6 正在全力冲刺
pool-1-thread-6 到达终点
所有运动员到达终点,比赛结束!
该示例代码中设置了两个 CountDownLatch,第一个 endSignal 用于控制让 main
线程(裁判员)必须等到其他线程(运动员)让 CountDownLatch 维护的数值 N
减到 0 为止。另一个 startSignal 用于让 main 线程对其他线程进行“发号施
令”,startSignal 引用的 CountDownLatch 初始值为 1,而其他线程执行的 run
方法中都会先通过 startSignal.await()让这些线程都被阻塞,直到 main 线程
通过调用 startSignal.countDown();,将值 N 减 1,CountDownLatch 维护的
数值 N 为 0 后,其他线程才能往下执行,并且,每个线程执行的 run 方法中
都会通过 endSignal.countDown();对 endSignal 维护的数值进行减一,由于往
线程池提交了 6 个任务,会被减 6 次,所以 endSignal 维护的值最终会变为
0,因此 main 线程在 latch.await();阻塞结束,才能继续往下执行。
剩余12页未读,继续阅读
资源评论
Andy&lin
- 粉丝: 98
- 资源: 214
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功