Thread--CountDownLatch & CyclicBarrier
参考: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是可以重用的。
Thread--CountDownLatch & CyclicBarrier的更多相关文章
- java 并发工具类CountDownLatch & CyclicBarrier
一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于ja ...
- 并发包下常见的同步工具类详解(CountDownLatch,CyclicBarrier,Semaphore)
目录 1. 前言 2. 闭锁CountDownLatch 2.1 CountDownLatch功能简介 2.2 使用CountDownLatch 2.3 CountDownLatch原理浅析 3.循环 ...
- 多线程中 CountDownLatch CyclicBarrier Semaphore的使用
CountDownLatch 调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行.也可以传入时间,表示时间到之后,count还没有为0的时候,就会继续执行. package ...
- CountDownLatch/CyclicBarrier/Semaphore 使用过吗?
CountDownLatch/CyclicBarrier/Semaphore 使用过吗?下面详细介绍用法: 一,(等待多线程完成的)CountDownLatch 背景; countDownLatch ...
- CountDownLatch CyclicBarrier和 Semaphore
CountDownLatch CyclicBarrier和 Semaphore 原理 基于AQS实现. 让需要的暂时阻塞的线程,进入一个死循环里面,得到某个条件后再退出循环,以此实现阻塞当前线程的效果 ...
- CountDownLatch/CyclicBarrier/Semaphore 使用过吗
CountDownLatch 让一些线程堵塞直到另一个线程完成一系列操作后才被唤醒.CountDownLatch 主要有两个方法,当一个或多个线程调用 await 方法时,调用线程会被堵塞,其他线程调 ...
- Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo
Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...
- 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)
在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...
- 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)
1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ...
- CountDownLatch, CyclicBarrier and Semaphore
Reference: [1] http://shazsterblog.blogspot.co.uk/2011/12/comparison-of-countdownlatch.html CountDow ...
随机推荐
- memset函数总结
之前有一个程序栽在了memset函数上面,对memset函数一直耿耿于怀,于是想总结一下这个常用但是总出错的函数. memset在string.h文件中是这么定义的: void*代表这个函数的返回值可 ...
- 第1节 HUE:13、hue的下载以及安装配置
hue的基本介绍:主要是用于与其他各个框架做整合的,提供一个web界面可以供我们去操作其他的大数据框架可以理解为这个hue就是一个与其他各个框架整合的工具,hue本身不提供任何的功能,所有的功能,都是 ...
- 第3节 sqoop:7、通过java代码远程连接linux执行shell命令
数据库的数据同步软件sqoop 数据同步 关系型数据库到大数据平台 任务:sqoop 是批量导入数据太慢,如何做到实时的数据同步 实时的数据同步工具: canal 阿里开源的一个数据库数据实时同步的软 ...
- 微信小程序IOS真机调试发生了SSL 错误,无法建立与该服务器的安全连接
小程序 真机调试 IOS request:fail 发生了SSL 错误,无法建立与该服务器的安全连接,解决方法服务器中打开Powerhell,执行以下代码,然后重启服务器 # Enables TLS ...
- 0203 生成mysql的数据库的数据字典
原理 项目的数据库字典表是一个很重要的文档.通过此文档可以清晰的了解数据表结构及开发者的设计意图. 通常为了方便我都是直接在数据库中建表,然后通过工具导出数据字典. 在Mysql数据库中有一个info ...
- 001.CI4框架CodeIgniter的默认访问路径url
1. 我们解压缩CI4的压缩包,找到app目录,点开Controllers目录,在Home.php文件中,写入我们的如下代码: 002.我们来访问我们的网站 http://127.0.0.1/CI4/ ...
- 07.Delphi接口的生命周期
在Delphi的接口中,是不需要释放的,调用完之后,接口的生命周期就结束了,如下面的例子 unit mtReaper; interface type // 定义一个接口 IBase = interfa ...
- C# 绘制矩形方框读写内存类 cs1.6人物透视例子
封装的有问题 其中方框可能在别的方向可能 会显示不出来建议不要下载了 抽时间我会用纯c#写一个例子的 其中绘制方框文字和直线调用的外部dll采用DX11(不吃CUP)绘制我封装成了DLL命名为 S ...
- local feature和global feature的理解
在计算机视觉方面,global feature是基于整张图像提取的特征,也就是说基于all pixels,常见的有颜色直方图.形状描述子.GIST等:local feature相对来说就是基于局部图像 ...
- msf自动连接postgresql配置
今天做了一下msf连接数据库的配置,中间碰到了一些坑点这里就不详细叙述了,开始正确的操作方式. 首先对postgresql进行配置以方便连接. root@kali:~# service postgre ...