参考: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是可以重用的。

最新文章

  1. C#非常重要基础之多态
  2. c++中的一些容易混淆的研究
  3. Spring知识汇总
  4. (转载)RTorrent 命令行使用说明
  5. iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法
  6. 从零开始学习Hadoop--第1章 Hadoop的安装
  7. Java获取当前日期的前一个月,前一天的时间
  8. centos6.5配置163的yum源
  9. Professional C# 6 and .NET Core 1.0 - Chapter 39 Windows Services
  10. struts2(五)之struts2拦截器与自定义拦截器
  11. java访问mysql数据库
  12. 查看 Centos 7 的MAC 地址
  13. 关于main函数的参数问题
  14. FreeRTOS的内存管理
  15. Python open 读和写
  16. js单元测试框架
  17. 问题-MethodAddress返回NIL?MethodAddress与published的关系?
  18. Activiti5小试牛刀demo流程
  19. Java中一种无意识的递归
  20. ASP.NET MVC 实现区域 项目分离 (比较好的方式)

热门文章

  1. Python测试进阶——(3)编写Python程序监控计算机的服务是否正常运行
  2. HiBench成长笔记——(7) 阅读《The HiBench Benchmark Suite: Characterization of the MapReduce-Based Data Analysis》
  3. 免杀PHP一句话一枚
  4. java随机函数用法Random
  5. Windows下使用Tomcat
  6. java核心-多线程(9)- ThreadLocal类
  7. 树莓派 Raspberry 软件源更改 看门狗启用
  8. etcd入门
  9. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-question-sign
  10. DevOps - 实施原则