Thread--CountDownLatch & CyclicBarrier
2024-09-04 20:46:08
参考:http://www.importnew.com/21889.html
CountDownLatch
countDown() 方法执行完只是计数器减一, 并不会阻塞当前运行线程的的后续代码执行.
package org.wzh.cc; import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.stream.IntStream; import static java.lang.System.out; public class D4CountDownLatch { class Task extends Thread { private CountDownLatch latch;
private int time; public Task(CountDownLatch latch) {
super();
this.latch = latch;
time = score();
} private int score() {
return (new Random().nextInt(8000) + 10000) / 1000;
} @Override
public void run() {
// TODO Auto-generated method stub
try {
String name = currentThread().getName();
out.println(name + " 预计成绩 " + time + " seconds");
out.println(name + " 正在冲刺");
sleep(time * 1000);
out.println(name + " 到达终点!");
latch.countDown();//跑完减一
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) throws InterruptedException {
out.println("-- 百米赛跑比赛 --");
out.println("参赛选手:");
String[] names = {"小明", "小强", "小智"};
Arrays.stream(names).forEach(out::println);
out.println("########## 比赛开始 #########"); CountDownLatch latch = new CountDownLatch(names.length);
IntStream.range(0, names.length).forEach(i -> {
Thread t = new D4CountDownLatch().new Task(latch);
t.setName(names[i]);
t.start();
});
latch.await();//当latch countDown指定的次数之后才会继续向下执行
out.println("百米赛跑比赛结束");
}
}
CyclicBarrier
await() 方法阻塞后面的代码,直到达到条件才继续向下执行.
package org.wzh.cc; import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.stream.IntStream; import static java.lang.System.out; public class D4CyclicBarrier { class Task extends Thread { private CyclicBarrier barrier;
private int time; public Task(CyclicBarrier barrier) {
super();
this.barrier = barrier;
time = score();
} private int score() {
return (new Random().nextInt(8000) + 10000) / 1000;
} @Override
public void run() {
try {
String name = currentThread().getName();
System.out.println(name + " 预计成绩 " + time + " seconds");
barrier.await();//线程阻塞在这边,直到所有参与的线程都到达这里
out.println(name + " 正在冲刺");
sleep(time * 1000);
out.println(name + " 到达终点!");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
try {
out.println("-- 百米赛跑比赛 --");
out.println("参赛选手:");
String[] names = {"小明", "小强", "小智"};
Arrays.stream(names).forEach(out::println);
out.println("########## 比赛开始 #########"); CyclicBarrier barrier = new CyclicBarrier(names.length + 1);//***
IntStream.range(0, names.length).forEach(i -> {
Thread t = new D4CyclicBarrier().new Task(barrier);
t.setName(names[i]);
t.start();
});
barrier.await();
System.out.println("百米赛跑比赛结束");
} catch (Exception e) {
e.printStackTrace();
}
} }
对比
区别
CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:
CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;
而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;
另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。
最新文章
- C#非常重要基础之多态
- c++中的一些容易混淆的研究
- Spring知识汇总
- (转载)RTorrent 命令行使用说明
- iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法
- 从零开始学习Hadoop--第1章 Hadoop的安装
- Java获取当前日期的前一个月,前一天的时间
- centos6.5配置163的yum源
- Professional C# 6 and .NET Core 1.0 - Chapter 39 Windows Services
- struts2(五)之struts2拦截器与自定义拦截器
- java访问mysql数据库
- 查看 Centos 7 的MAC 地址
- 关于main函数的参数问题
- FreeRTOS的内存管理
- Python open 读和写
- js单元测试框架
- 问题-MethodAddress返回NIL?MethodAddress与published的关系?
- Activiti5小试牛刀demo流程
- Java中一种无意识的递归
- ASP.NET MVC 实现区域 项目分离 (比较好的方式)
热门文章
- Python测试进阶——(3)编写Python程序监控计算机的服务是否正常运行
- HiBench成长笔记——(7) 阅读《The HiBench Benchmark Suite: Characterization of the MapReduce-Based Data Analysis》
- 免杀PHP一句话一枚
- java随机函数用法Random
- Windows下使用Tomcat
- java核心-多线程(9)- ThreadLocal类
- 树莓派 Raspberry 软件源更改 看门狗启用
- etcd入门
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-question-sign
- DevOps - 实施原则