四个类可协助实现常见的专用同步语句。Semaphore 是一个经典的并发工具。CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号、事件或条件前阻塞执行。CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

等待其他线程:CountDownLatch(其实就是个倒序计数器)

当其他线程完成之前,该类线程一直处于等待状态.

场景需求:

起点裁判倒计时....之后 运动员起跑,然后终点裁判发布成绩.

要让起点裁判线程优先执行.

老师开始给出了一个线程的join方法可以实现这个需求. t.join(); // 优先执行当前线程

但是join不好,因为如果t对应的线程不执行完,其他的所有线程都不会被执行到.

可以使用CountDownLatch.

final CountDownLatch cdl1 = new CountDownLatch(1);

刚开始让4个运动员线程处于等待状态,然后判断,有一个计数器int i = 1,裁判线程获得这个计数器.

裁判执行完对应的代码之后,把i变成0,如果运动员获得i=0,就开始执行.

要等到最后一个运动员线程执行完,终点裁判宣布成绩.

定义一个初始值是4的计数器,有个运动员到终点就减去1(cdl1.countDown();// 计数器减1).

cdl2.await();// 等待计数器变为0

CountDownLatchDemo.java

 import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException {
final CountDownLatch cdl1 = new CountDownLatch(1);
final CountDownLatch cdl2 = new CountDownLatch(4); // t.join(); // 优先执行当前线程 for (int i = 0; i < 4; i++) {
new Thread(new Runnable() {// 运动员 @Override
public void run() {
try {
cdl1.await(); // 等待计数器变为0 System.out.println(Thread.currentThread()
.getName() + " : 起跑");
TimeUnit.SECONDS.sleep(new Random().nextInt(3));
System.out.println(Thread.currentThread()
.getName() + " : 到达终点!");
cdl2.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
} Thread t = new Thread(new Runnable() {// 发布命令的裁判 @Override
public void run() {
System.out.println("准备");
for (int i = 3; i >= 1; i--) {
System.out.println(i + "...");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("跑!");
cdl1.countDown();// 计数器减1 }
});
t.start(); new Thread(new Runnable() {// 宣布成绩的裁判 @Override
public void run() {
try {
cdl2.await();// 等待计数器变为0
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("宣布成绩!");
}
}).start(); }
}

最新文章

  1. Java transient 关键字
  2. angularJS中directive与directive 之间的通信
  3. fixed的left:50%,漂浮
  4. 【练习】数据移动---parfile导出表中指定行:
  5. 本地数据下,radiobutton和图片组合,利用adapter+listview进行单选
  6. php获取目录中的所有文件名
  7. nginx redis tomcat 分布式web应用 session共享
  8. iOS AppIcon + launchImage+iPhone 屏幕分辨率相关知识
  9. AngularJS clone directive 指令复制
  10. 懒省事的小明--nyoj55
  11. 苹果推送通知服务Push Notification探究总结(序)
  12. Asp.net Ajax提供PageMethods调用
  13. alpha冲刺第五天
  14. CCDrawNode类的引用
  15. Oracle知识点总结2
  16. PKCS RSA执行标准
  17. 洛谷 P1464 Function【记忆化搜索】
  18. 集成xxl-job分布式任务调度平台
  19. HDU 2061 Treasure the new start, freshmen!
  20. Spring cloud @RefreshScope使用

热门文章

  1. ICMP协议、DNS、ARP协议、ping、DHCP协议
  2. nginx proxy_pass后的url加不加/的区别
  3. MODULE_DEVICE_TABLE 的作用
  4. 大压力下Redis参数调整要点
  5. Spring的下载与安装
  6. (转)Tomcat(java运行环境)安装及配置教程
  7. 个人理解的int数组和char数组
  8. linux 各项分布(个人记录)
  9. spring启动component-scan类扫描加载,以及@Resource,postConstruct等等注解的解析生效源码
  10. index.jsp首页访问不了的解决方法