多线程进阶---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 ...
随机推荐
- 关于tomcat的Unsupported major.minor version 51.0问题记录
今天在构建一个应用时使用了注解的方式,可能是别的原因,正常访问一个servlet的时候报了一个从来没见过的错误. 2017-5-12 15:54:52 org.apache.catalina.core ...
- mvc中html导出成word下载-简单粗暴方式
由于工作需求,需要把html简历页导出成word下载.网上搜索了很多解决方案,基本都是用一些插件,然后写法也很麻烦,需要创建模板什么的. 固定替换值 代码一大堆.但是对于我的需求来说 并没有什么用 ...
- crontab 各参数详解及如何查看日志记录
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt145 crontab各参数说明: crontab [-u user] [fi ...
- Unity3d&C#分布式游戏服务器ET框架介绍-组件式设计
前几天写了<开源分享 Unity3d客户端与C#分布式服务端游戏框架>,受到很多人关注,QQ群几天就加了80多个人.开源这个框架的主要目的也是分享自己设计ET的一些想法,所以我准备写一系列 ...
- hdu 2503 1713 1108 最小公倍数&最大公约数
gcd模板: __int64 gcd(__int64 a,__int64 b) { retur b==0?a:gcd(b,a%b); } 1108: #include<iostream> ...
- 没有闲话和grunt.initConfig()
grunt.initConfig()为Gruntfile.js的核心部分,它接收对象作为参数. 对象包含两种类型的属性,一种是单纯的变量,一种是task类型.举个栗子: grunt.initConfi ...
- linq 起源
在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...
- cmake命令收集
cmake中一些预定义变量 PROJECT_SOURCE_DIR 工程的根目录 PROJECT_BINARY_DIR 运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/bui ...
- GUI(自定义背景图片)
如果组件中没有setIcon(...);这个方法,这是有需要给组件设置背景图片,这时就可以自定义绘制背景图片 /** * */ package com.niit.javagui; import jav ...
- 201521123098 《Java程序设计》第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1. finally 题目4-2 1.1 截图你的提交结果( ...