参考: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. C#:string、stringBuffer、stringBuilder的区别

    好脑子不如烂笔头,总是记不住,记下来吧 依然 搬运 地址: http://blog.csdn.net/qq_28187979/article/details/76607253 ------------ ...

  2. Golang的基础数据类型-字符串型

    Golang的基础数据类型-字符串型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符型概述 上一篇博客学习了使用单引号括起来的单个字符就是字符类型,在Golang中有两种表 ...

  3. [YOLO]《YOLO9000:Better, Faster, Stronger》笔记

    一.简单介绍 YOLO9000(也叫YOLO v2),主要是在YOLO v1的基础上做了改进,而且效果还是比较显著的,在原论文中,作者提到的改进大致包括两个工作: 1.检测性能上的改进,提出了YOLO ...

  4. 全局保存ajax请求到的数据

    var menuJson = (function() {        var result;        $.ajax({            type: 'get',            u ...

  5. python基础笔记:判断与循环

    判断: #根据身高为1.75,体重为65的小明的bmi输出小明的身材 h=1.75 w=65 bmi=w/(h*h) if bmi<18.5: print('过轻') elif bmi<= ...

  6. redis报错MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist

    解决方法:通过redis-cli连接到服务器后执行以下命令: config set stop-writes-on-bgsave-error no 注意:这种方法只是忽略了问题,并没有解决问题,具体问题 ...

  7. JPA#OneToOne

    无力吐槽. 一对一,一个人有一个身份证号码.一个人有一条命,类似于这一种的就是一对一的关系. 涉及到的注解两个: OneToOne JoinColumn( name="当前实体对应数据库表中 ...

  8. 升级安装go1.13.5

    运行文件时报错 verifying github.com/mattn/go-isatty@v0.0.10-0.20190818123653-bf9a1dea1961/go.mod: github.co ...

  9. 118-PHP调用带参数的成员方法

    <?php class ren{ //定义人类 public function info($name,$age=3){ //定义有两个参数的成员方法 echo "我是{$name},年 ...

  10. JNI操作二维数组

    之前的文章讲解了有关JNI使用方法,这篇文章进阶一点,介绍下JNI操作二维数组的方法.有了之前文章的操作JNI的方法,这里直接上代码了. Java代码部分 package com.testjni; p ...