参考: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的更多相关文章

  1. java 并发工具类CountDownLatch & CyclicBarrier

    一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于ja ...

  2. 并发包下常见的同步工具类详解(CountDownLatch,CyclicBarrier,Semaphore)

    目录 1. 前言 2. 闭锁CountDownLatch 2.1 CountDownLatch功能简介 2.2 使用CountDownLatch 2.3 CountDownLatch原理浅析 3.循环 ...

  3. 多线程中 CountDownLatch CyclicBarrier Semaphore的使用

    CountDownLatch 调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行.也可以传入时间,表示时间到之后,count还没有为0的时候,就会继续执行. package ...

  4. CountDownLatch/CyclicBarrier/Semaphore 使用过吗?

    CountDownLatch/CyclicBarrier/Semaphore 使用过吗?下面详细介绍用法: 一,(等待多线程完成的)CountDownLatch  背景; countDownLatch ...

  5. CountDownLatch CyclicBarrier和 Semaphore

    CountDownLatch CyclicBarrier和 Semaphore 原理 基于AQS实现. 让需要的暂时阻塞的线程,进入一个死循环里面,得到某个条件后再退出循环,以此实现阻塞当前线程的效果 ...

  6. CountDownLatch/CyclicBarrier/Semaphore 使用过吗

    CountDownLatch 让一些线程堵塞直到另一个线程完成一系列操作后才被唤醒.CountDownLatch 主要有两个方法,当一个或多个线程调用 await 方法时,调用线程会被堵塞,其他线程调 ...

  7. Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo

    Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...

  8. 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)

    在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...

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

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

  10. CountDownLatch, CyclicBarrier and Semaphore

    Reference: [1] http://shazsterblog.blogspot.co.uk/2011/12/comparison-of-countdownlatch.html CountDow ...

随机推荐

  1. 51nod 1433:0和5

    1433 0和5 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  取消关注 小K手中有n张牌,每张牌上有一个一位数的数, ...

  2. wpf和winform的区别

    深入浅出WPF(7)——数据的绿色通道,Binding(上) 水之真谛关注6人评论28117人阅读2008-06-23 02:40:00  http://liuteimeng.blog.51cto.c ...

  3. springboot启动不能加载数据库驱动Failed to determine a suitable driver class

    SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/G:/sharp/repo ...

  4. mybatis-generator-plugin

    1.背景 这篇文章刚开始想着哪个分类呢?mybatis.idea或是maven呢,最后还是选择了mybatis.最初使用这个逆向工具是在eclipse上,使用的是eclispe上mbg插件执行配置ge ...

  5. NO7 利用三剑客awk-grep-sed-head-tail等7种方法实践

    ·seq   sequence  #序列·sed   stream editor  #(三剑客老二)流编辑器.实现对文件的增删改替换查.        -n #取消默认输出.sed -n '20,30 ...

  6. P1040 有几个PAT

    转跳点:

  7. mongodb单机版的安装和配置

    首先根据操作系统下载MongoDB的相关安装文件 下载后上传到linux上,解压 将解压后的文件夹重新命名为monggodb4.0.1 命令mv 配置必要的文件夹mgdata存放运行数据,mglog存 ...

  8. bzoj 2451 Uyuw's Concert

    裸的半平面交.感觉这些东西,纯属在考代码能力啊.. #include<cstdio> #include<algorithm> #include<cmath> #de ...

  9. hdu 1950 Bridging signals 求最长子序列 ( 二分模板 )

    Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  10. Promise 与 await 组合使用

    看例子就行了,废话不多说!   async function checkStatus(name){   return new Promise((resolve,reject) => {      ...