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类似于锁,对资源访问权限控制。

最新文章

  1. [LeetCode] Second Highest Salary 第二高薪水
  2. angular $http 与form表单的select--&gt;refine
  3. IUS
  4. Swift游戏实战-跑酷熊猫 05 踩踏平台是怎么炼成的
  5. JavaScript高级程序设计之函数性能
  6. C语言预处理命令
  7. SAE J1850 VPW PWM, SAE J2411 SWC, ISO 11898 CAN, SAE J1708, Chrysler CCD 接口芯片电路
  8. HTML--内联元素与块级元素
  9. jquery cookie 用法
  10. 从0开始学习react(三)
  11. MySQL 遇到的问题:在服务里找不到自己的 MySQL,以及在命令行窗口中运行服务出现的问题。
  12. ECharts API
  13. centos7下kubernetes(7.kubernetesScale Up/Down)
  14. 超简单的实现wordcount
  15. Linux文件系统3--打开文件
  16. sas 变量类型转换
  17. FireDAC 下的 Sqlite [10] - 使用 R-Tree 搜索
  18. crontab 执行脚本,报错/home/scripts/eyeMonitor.sh: line 8: node: command not found
  19. DWZ验证表单规则一览
  20. [Objective-C语言教程]数据封装(27)

热门文章

  1. P1063 计算谱半径
  2. 5G大潮下卖点越来越少的苹果,会成为下一个诺基亚吗?
  3. Delphi 10.3.3 THTTPClient Post问题
  4. 051、Java中使用while循环实现1~100的累加
  5. SQL添加列、非空、默认值
  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-fast-forward
  7. Windows安装tensorflow,配置vs2013,anaconda3.4,cudn9.0,cudnn7.0和pycharm
  8. C++获取文件夹中所有文件
  9. redis改配置
  10. Window Server 2019 配置篇(6)- 利用组策略实现域内自动安装软件