Java 并发编程之 CyclicBarrier
Java juc 大约 3386 字作用
允许一组线程互相等待,以达到共同的障碍点,再执行CyclicBarrier
中指定Runable
任务。
人满开车:到3
(设置人数)就开车
。
构造函数
parties
: 线程必须调用await
的次数。
barrierAction
:线程都到达障碍点后执行的操作。(无此参数的构造表示:达到障碍点后不做任何操作。)
public CyclicBarrier(int parties, Runnable barrierAction) {
if (parties <= 0) throw new IllegalArgumentException();
this.parties = parties;
this.count = parties;
this.barrierCommand = barrierAction;
}
await() 方法
如果当前线程不是最后一个到达障碍点的,出于调度目的而将此线程禁用,并处于休眠状态,直到以下事件发生:
- 最后一个线程到达障碍点;
- 其他线程打断了当前线程;
- 其他线程打断了处于等待的线程;
- 其他线程等待障碍点时超时;
- 重置了障碍点
barrierAction
该Runnable
任务执行在最后一个到达障碍点的线程中。并且只有在执行完该任务后其余等待线程才继续后续操作。
案例
public class CyclicBarrierDemo {
public static void main(String[] args) {
System.out.println(LocalDateTime.now() + ": ThreadId: " + Thread.currentThread().getId()+" 开始CyclicBarrier");
CyclicBarrier cyclicBarrier = new CyclicBarrier(3,() -> {
System.out.println(LocalDateTime.now() + ": ThreadId: " + Thread.currentThread().getId()+", 完成所有接口请求, 合并数据---开始");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(LocalDateTime.now() + ": ThreadId: " + Thread.currentThread().getId()+", 完成所有接口请求, 合并数据---结束");
});
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(2);
System.out.println(LocalDateTime.now() + ": ThreadId: " + Thread.currentThread().getId()+", 模拟请求API-1, 耗时2秒, 完成, 等待其他接口返回");
cyclicBarrier.await();
System.out.println(LocalDateTime.now() + ": ThreadId: " + Thread.currentThread().getId()+", CyclicBarrier释放了, API-1");
} catch (Exception e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(4);
System.out.println(LocalDateTime.now() + ": ThreadId: " + Thread.currentThread().getId()+", 模拟请求API-2, 耗时4秒, 完成, 等待其他接口返回");
cyclicBarrier.await();
System.out.println(LocalDateTime.now() + ": ThreadId: " + Thread.currentThread().getId()+", CyclicBarrier释放了, API-2");
} catch (Exception e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(3);
System.out.println(LocalDateTime.now() + ": ThreadId: " + Thread.currentThread().getId()+", 模拟请求API-3, 耗时3秒, 完成, 等待其他接口返回");
cyclicBarrier.await();
System.out.println(LocalDateTime.now() + ": ThreadId: " + Thread.currentThread().getId()+", CyclicBarrier释放了, API-3");
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
输出:
2020-01-17T14:43:26.314: ThreadId: 1 开始CyclicBarrier
2020-01-17T14:43:28.325: ThreadId: 12, 模拟请求API-1, 耗时2秒, 完成, 等待其他接口返回
2020-01-17T14:43:29.325: ThreadId: 14, 模拟请求API-3, 耗时3秒, 完成, 等待其他接口返回
2020-01-17T14:43:30.325: ThreadId: 13, 模拟请求API-2, 耗时4秒, 完成, 等待其他接口返回
2020-01-17T14:43:30.325: ThreadId: 13, 完成所有接口请求, 合并数据---开始
2020-01-17T14:43:33.326: ThreadId: 13, 完成所有接口请求, 合并数据---结束
2020-01-17T14:43:33.326: ThreadId: 13, CyclicBarrier释放了, API-2
2020-01-17T14:43:33.326: ThreadId: 12, CyclicBarrier释放了, API-1
2020-01-17T14:43:33.326: ThreadId: 14, CyclicBarrier释放了, API-3
阅读 1819 · 发布于 2020-01-17
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb扫描下方二维码关注公众号和小程序↓↓↓

昵称:
随便看看
换一批
-
Arthas 启动报 ClassNotFoundException com.sun.tools.attach.VirtualMachine阅读 4579
-
k3s 部署简化版 Kubernetes阅读 1102
-
软考-系统架构设计师:数据库安全阅读 1416
-
Notepad++ 保存 Ctrl-S 显示 DC3 ,搜索 Ctrl-F 显示 ACK 解决办法阅读 6872
-
Kubernetes kubectl top 命令报 error: Metrics API not available阅读 1664
-
前端 Chrome 反调试方法阅读 4529
-
Docker WARNING IPv4 forwarding is disabled. Networking will not work阅读 889
-
Spring Boot 中去除 spring-data-mongodb 自动生成的 _class 字段阅读 4141
-
minikube 使用 VirtualBox 安装迷你版 Kubernetes 集群阅读 680
-
Java 并发编程之 ConcurrentSkipListSet阅读 954