多线程进阶---Thread.join()/CountDownLatch.await() /CyclicBarrier.await()
Thread.join()
CountDownLatch.await()
CyclicBarrier.await()
三者都是用来控制程序的“流动” 可以让程序“堵塞”在某几个点 以利用经由多线程操作后的某些最终结果
eg1:
1 public class joinTest {
2
3 private static Thread[] ts = new Thread[10];
4 private static AtomicInteger ai = new AtomicInteger(0);
5
6 public joinTest() {
7 for (int i = 0; i < 10; i++) {
8 ts[i] = new Thread() {
9 @Override
10 public void run() {
11 try {
12 Thread.sleep(100);
13 }catch (Exception e){
14
15 }
16 ai.incrementAndGet();
17 }
18 };
19 }
20 }
21
22
23
24
25 public static void main(String[] args) throws Exception {
26
27 new joinTest();
28
29 for (int i = 0; i < 10; i++) {
30 ts[i].start();
31 }
32
33 for (int i = 0; i < 10; i++) {
34 ts[i].join();
35 }
36
37 System.out.println(ai);
38
39 }
40
41 }
此时输出为10
注意在run方法中的sleep操作,此时必须写到try/catch代码块内,因为异常不能跨线程传播 所以不能写在方法尾部throws!
eg2:
public class controlThread {
private static final int ThreadCount = 500;
private static AtomicInteger result = new AtomicInteger(0);
private static CountDownLatch endCount = new CountDownLatch(ThreadCount); static void helper(){
for(int i=0;i<500;i++){
new Thread() {
@Override
public void run() {
result.incrementAndGet();
endCount.countDown();
}
}.start();
} } public static void main(String[] args) throws Exception{
new Thread(){
@Override
public void run(){
helper();
}
}.start(); endCount.await();
//Thread.sleep(10);
print(result);
}
}
此时result结果为500
如果注释掉await() 加上sleep 则数值随机
全都注释掉一般情况为0
eg3:
public class cyclicBarrierTest {
private static CyclicBarrier cyclic = new CyclicBarrier(5,new BarrierRun());
private static boolean flag = false;
static class BarrierRun implements Runnable{
@Override
public void run(){
if(!flag)
print("we five are ready!");
else
print("we five are ready again!");
}
} public static void main(String[] args) throws Exception {
for (int i = 0; i < 5; i++) {
new Thread() {
@Override
public void run() { try {
print(Thread.currentThread()+"'s worker has comed");
cyclic.await();
flag = true ;
print(Thread.currentThread()+"wait you five so long!");
cyclic.await();
} catch (Exception e) {
e.printStackTrace();
} }
}.start();
} } }
只有当指定数目的线程进入到cyclic.await()方法处,才会让各个线程继续执行。 而且该方法可以复用。
这里如果某一个线程被中断,其他程序将不会愚蠢的等待 人到齐了 再执行接下来的任务 此时程序报错
多线程进阶---Thread.join()/CountDownLatch.await() /CyclicBarrier.await()的更多相关文章
- Thread.join(), CountDownLatch、CyclicBarrier和 Semaphore区别,联系及应用
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法, 由于 ...
- 多线程工具类:CountDownLatch、CyclicBarrier、Semaphore、LockSupport
◆CountDownLatch◆ 假如有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以.比如你想要买套房子,但是呢你现在手上没有钱.你得等这个月工资发了.然后年终奖发了.然后朋友借你得钱 ...
- 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)
1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ...
- CountDownLatch和CyclicBarrier的区别
[CountDownLatch.CyclicBarrier和Semaphore]http://www.cnblogs.com/dolphin0520/p/3920397.html [CountDo ...
- CyclicBarrier、CountDownLatch、Callable、FutureTask、thread.join() 、wait()、notify()、Condition
CyclicBarrier使用: import java.util.Random; import java.util.concurrent.BrokenBarrierException; import ...
- .NET多线程(Thread,ThreadPool,Task,Async与Await)
.NET多线程是什么? 进程与线程 进程是一种正在执行的程序. 线程是程序中的一个执行流. 多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务. .NET中的线程 Thread是创建和控制 ...
- java多线程并发控制countDownLatch和cyclicBarrier的使用
java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用 ...
- 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier
目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...
- 多线程进阶——JUC并发编程之CountDownLatch源码一探究竟
1.学习切入点 JDK的并发包中提供了几个非常有用的并发工具类. CountDownLatch. CyclicBarrier和 Semaphore工具类提供了一种并发流程控制的手段.本文将介绍Coun ...
随机推荐
- 电源库(Sources)
- Jmeter录制脚本工具之chrome插件--BlazeMeter
前几天在我们的交流群,看到有童鞋问到BlazeMeter这个工具的用法,感觉还是一个比较不错的插件,比起我们大费周章的去安装badboy或者是使用Jmeter的代理服务器去录制脚本要容易多啦!大家有问 ...
- hdu 6096---String(AC自动机)
题目链接 Problem Description Bob has a dictionary with N words in it.Now there is a list of words in whi ...
- [2017-08-16]ABP系列——QuickStartB:正确理解Abp解决方案的代码组织方式、分层和命名空间
本系列目录:Abp介绍和经验分享-目录 介绍ABP的文章,大多会提到ABP框架吸收了很多最佳实践,比如: 1.N层 (复用一下上篇的图) 展现层(Personball.Demo.Web):asp.ne ...
- 关于makefile中变量的多次赋值以及override指令
1 基本原则如下 1.1 原则1 变量的普通赋值是有先后顺序的,后面的赋值会覆盖掉前面的赋值. 1.2 原则2 使用的时候,用的是其前面最后的赋值,就算其后面有使用了override指令的赋值也不会影 ...
- 快速排序/快速查找(第k个, 前k个问题)
//快速排序:Partition分割函数,三数中值分割 bool g_bInvalidInput = false; int median3(int* data, int start, int end) ...
- JS中的函数和BOM
文档注释:开头两个*.写在函数上方,在调用函数时, 可以看到文档中的描述信息:function aaa(){ } [函数的声明及调用] 1.函数的声明格式: function 函数名(参数1,参数2, ...
- 【转载】js常用方法和片段
在网上看了不少js方法的总结没,自己也尝试总结过,这篇只迄今为止觉得最清楚的,尤其是call和apply的方法总结,很到位!! 1.javascript删除元素节点 IE中有这样一个方法:remove ...
- vue非父子组件间通信
有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的Vue实例作为中央事件总线: 有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的 Vue 实例作为中央事件总线: var bu ...
- spring 发邮件
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt116 Spring邮件抽象层的主要包为org.springframework ...