CountDownLatch、CyclicBarrier、Semaphore的使用
2024-09-03 20:00:50
CountDownLatch(计数器)
主线程等待另外三个线程执行完成后再执行
public static void main(String[] args) {
//定义一个CountDownLatch
CountDownLatch countDownLatch = new CountDownLatch(3);
// 主线程等待另外三个线程执行完成后再执行
new Thread(() -> {
try {
System.out.println("开始执行01");
Thread.sleep(3000);
System.out.println("执行完成01");
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start(); new Thread(() -> {
try {
System.out.println("开始执行02");
Thread.sleep(3000);
System.out.println("执行完成02");
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start(); new Thread(() -> {
try {
System.out.println("开始执行03");
Thread.sleep(3000);
System.out.println("执行完成03");
countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start(); try {
System.out.println("等待3个线程执行完毕。。。");
countDownLatch.await();
System.out.println("主线程开始执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
CyclicBarrier(回环栅栏)
三个线程互相等待await执行完成后继续执行
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3); // 三个线程互相等待await执行完成后继续执行
new Thread(() -> {
try {
System.out.println("开始执行01");
Thread.sleep(3000);
System.out.println("执行完成01");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"所有线程执行完毕,继续处理其他任务...");
}).start(); new Thread(() -> {
try {
System.out.println("开始执行02");
Thread.sleep(3000);
System.out.println("执行完成02");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"所有线程执行完毕,继续处理其他任务...");
}).start(); new Thread(() -> {
try {
System.out.println("开始执行03");
Thread.sleep(3000);
System.out.println("执行完成03");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"所有线程执行完毕,继续处理其他任务...");
}).start(); }
Semaphore(信号量)
8个工人使用5台机器
public class Test {
public static void main(String[] args) {
int N = 8; //工人数
Semaphore semaphore = new Semaphore(5); //机器数目
for(int i=0;i<N;i++)
new Worker(i,semaphore).start();
} static class Worker extends Thread{
private int num;
private Semaphore semaphore;
public Worker(int num,Semaphore semaphore){
this.num = num;
this.semaphore = semaphore;
} @Override
public void run() {
try {
semaphore.acquire();
System.out.println("工人"+this.num+"占用一个机器在生产...");
Thread.sleep(2000);
System.out.println("工人"+this.num+"释放出机器");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
总结
- CountDownLatch用作某个线程等待其他的线程执行完成后,它才执行。
- CyclicBarrier用作一组线程等待到某个状态,然后这组线程才继续执行。
- CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。
- Semaphore类似于锁,对资源访问权限控制。
最新文章
- [LeetCode] Second Highest Salary 第二高薪水
- angular $http 与form表单的select-->;refine
- IUS
- Swift游戏实战-跑酷熊猫 05 踩踏平台是怎么炼成的
- JavaScript高级程序设计之函数性能
- C语言预处理命令
- SAE J1850 VPW PWM, SAE J2411 SWC, ISO 11898 CAN, SAE J1708, Chrysler CCD 接口芯片电路
- HTML--内联元素与块级元素
- jquery cookie 用法
- 从0开始学习react(三)
- MySQL 遇到的问题:在服务里找不到自己的 MySQL,以及在命令行窗口中运行服务出现的问题。
- ECharts API
- centos7下kubernetes(7.kubernetesScale Up/Down)
- 超简单的实现wordcount
- Linux文件系统3--打开文件
- sas 变量类型转换
- FireDAC 下的 Sqlite [10] - 使用 R-Tree 搜索
- crontab 执行脚本,报错/home/scripts/eyeMonitor.sh: line 8: node: command not found
- DWZ验证表单规则一览
- [Objective-C语言教程]数据封装(27)
热门文章
- P1063 计算谱半径
- 5G大潮下卖点越来越少的苹果,会成为下一个诺基亚吗?
- Delphi 10.3.3 THTTPClient Post问题
- 051、Java中使用while循环实现1~100的累加
- SQL添加列、非空、默认值
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-fast-forward
- Windows安装tensorflow,配置vs2013,anaconda3.4,cudn9.0,cudnn7.0和pycharm
- C++获取文件夹中所有文件
- redis改配置
- Window Server 2019 配置篇(6)- 利用组策略实现域内自动安装软件