参考: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. 2-10 就业课(2.0)-oozie:4、通过oozie执行shell脚本

    oozie的配置文件job.properties:里面主要定义的是一些key,value对,定义了一些变量,这些变量往workflow.xml里面传递workflow.xml :workflow的配置 ...

  2. RTL8711AM

    官方文档主要修改 为了实现log服务 1,在log_service.h 取消注释 #ifndef LOG_SERVICE_H #define LOG_SERVICE_H #include " ...

  3. iOS Framework制作流程

    1.新建工程选择iOS —> Cocoa Touch Framework 2.进入创建好的工程删除掉自带的工程同名头文件 3.添加所需文件 4.TARGETS —> Build Setti ...

  4. [Codeforces #608 div2]1272B Blocks

    Description There are nnn blocks arranged in a row and numbered from left to right, starting from on ...

  5. 024、MySQL字符串替换函数,文本替换函数

    #文本替换 ,,'); #520ABCDEFG ,,'); #520BCDEFG ,,'); #520CDEFG ,,'); #A520BCDEFG ,,'); #A520CDEFG ,,'); #A ...

  6. Delphi IDFtp用法,包含断点续传

    1  连接远程服务器procedure Connect(AAutoLogin: boolean; const ATimeout: Integer);2  改变目录procedure ChangeDir ...

  7. maven项目添加配置文件

    1. 在src/main/resources下新建param.properties 2. 在param.properties文件中添加 mqtt.host=tcp://127.0.0.1:1883 m ...

  8. 验证试验 更改了从机CAN通信的MAC地址 从机新挂CAN网络 上电自检通过

    更改前 该之后 主机程序 与 从机 程序 已经上传到网盘上 ,主机和从机程序基本一致, 唯一的区别是 从机更好了MAC地址 为0X10  主机的固定MAC地址为 0X1F 改程序的配置上设置的是双滤波 ...

  9. CharacterEncodingFilter这个spring的过滤器

    org.springframework.web.filter.CharacterEncodingFilter 对请求于响应的编码进行过滤,半路出家的和尚总是对什么都感觉到好奇,都想记录下来(

  10. 七十一、SAP中内表的修改,改一行数据,或一行的某个字段

    一.SAP中内表的修改,只能通过工作区来修改,代码如下 二.效果如下