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()的更多相关文章

  1. Thread.join(), CountDownLatch、CyclicBarrier和 Semaphore区别,联系及应用

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法, 由于 ...

  2. 多线程工具类:CountDownLatch、CyclicBarrier、Semaphore、LockSupport

    ◆CountDownLatch◆ 假如有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以.比如你想要买套房子,但是呢你现在手上没有钱.你得等这个月工资发了.然后年终奖发了.然后朋友借你得钱 ...

  3. 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)

    1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ...

  4. CountDownLatch和CyclicBarrier的区别

    [CountDownLatch.CyclicBarrier和Semaphore]http://www.cnblogs.com/dolphin0520/p/3920397.html   [CountDo ...

  5. CyclicBarrier、CountDownLatch、Callable、FutureTask、thread.join() 、wait()、notify()、Condition

    CyclicBarrier使用: import java.util.Random; import java.util.concurrent.BrokenBarrierException; import ...

  6. .NET多线程(Thread,ThreadPool,Task,Async与Await)

    .NET多线程是什么? 进程与线程 进程是一种正在执行的程序. 线程是程序中的一个执行流. 多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务. .NET中的线程 Thread是创建和控制 ...

  7. java多线程并发控制countDownLatch和cyclicBarrier的使用

    java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用 ...

  8. 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier

    目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...

  9. 多线程进阶——JUC并发编程之CountDownLatch源码一探究竟

    1.学习切入点 JDK的并发包中提供了几个非常有用的并发工具类. CountDownLatch. CyclicBarrier和 Semaphore工具类提供了一种并发流程控制的手段.本文将介绍Coun ...

随机推荐

  1. 关于JDBC导入mysql的jar驱动的头痛

    今天上午想写个小程序,需要调用数据库,查了书和各个博客. 最后卡在导入mysql驱动上了,花了1个多小时才让程序连上数据库. 这里有个小误区,你下载的是zip压缩文件,很多帖子写的都是让你导入驱动,但 ...

  2. hr用法

    定义和用法 <hr> 标签在 HTML 页面中创建一条水平线. 水平分隔线(horizontal rule)可以在视觉上将文档分隔成各个部分. HTML 与 XHTML 之间的差异 在 H ...

  3. 好用的sql

    @ 复制表结构 ; --复制表结构和数据 create table table_name_new as select * from <table_name> @ 查看表信息 select ...

  4. K/3 WISE V14.3官方原版云盘下载地址及培训PPT

    电梯直达 楼主    发表于 15 分钟前 | 只看该作者    查看 : 10|回复 : 0 金蝶K/3 WISE打造企业"智造力",为企业财务管理决策提供全方位信息,产.供.销 ...

  5. Spring Cloud官方文档中文版-服务发现:Eureka服务端

    官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR3/#spring-cloud-eureka-server 文中例子我做了一些 ...

  6. Jquery的入门学习

    jQuery API中文文档地址 http://www.jquery123.com/ Jquery w3school教程 http://www.w3school.com.cn/jquery/index ...

  7. java基于注解的redis自动缓存实现

    目的: 对于查询接口所得到的数据,只需要配置注解,就自动存入redis!此后一定时间内,都从redis中获取数据,从而减轻数据库压力. 示例: package com.itliucheng.biz; ...

  8. 构建具有用户身份认证的 React + Flux 应用程序

    原文:Build a React + Flux App with User Authentication 译者:nzbin 译者的话:这是一篇内容详实的 React + Flux 教程,文章主要介绍了 ...

  9. Run Logic

    1.lr_output_message()函数,其作用是将内容输出到Replay Log中: 如果输出整数型内容,应该这样写; int x; x=10; lr_output_message(" ...

  10. NHibernate教程(19) —— 一级缓存

    本节内容 引入 NHibernate一级缓存介绍 NHibernate一级缓存管理 结语 引入 大家看看上一篇了吗?对象状态.这很容易延伸到NHibernate的缓存.在项目中我们灵活的使用NHibe ...