Java:多线程,CountDownLatch同步器
1. 背景
CountDownLatch类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。
2. 示范代码
下面代码示范了如果扑克游戏一桌人都到齐了,则翻底牌:
package com.clzhang.sample.thread; import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class SyncCountDownLatch {
class PokerPlayer implements Runnable {
private final String[] POINTS = new String[]{"A", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "J", "Q", "K",}; private String name;
private CountDownLatch countDown;
public PokerPlayer(String name, CountDownLatch countDown) {
this.name = name;
this.countDown = countDown;
} @Override
public void run() {
try {
Thread.sleep((long) (Math.random() * 5000)); // 随机抽一张牌
Random random = new Random();
String myPoint = POINTS[random.nextInt(13)];
System.out.println(name + "ready!"); // 准备就绪,等待其它玩家也就绪
countDown.countDown();
countDown.await(); // 玩家都就绪了,翻底牌
System.out.println(name + ":" + myPoint);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
final int PER_TABLE_PLAYERS = 4; // 多少人够开一桌的
CountDownLatch countDown = new CountDownLatch(PER_TABLE_PLAYERS); SyncCountDownLatch ins = new SyncCountDownLatch();
ExecutorService executorPool = Executors.newFixedThreadPool(PER_TABLE_PLAYERS);
for(int i=0; i<PER_TABLE_PLAYERS; i++) {
executorPool.execute(ins.new PokerPlayer(i +"号玩家", countDown));
} executorPool.shutdown();
}
}
输出
3号玩家ready!
0号玩家ready!
1号玩家ready!
2号玩家ready!
3号玩家:5
0号玩家:3
1号玩家:7
2号玩家:6
Java:多线程,CountDownLatch同步器的更多相关文章
- 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例
java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...
- Java多线程-CountDownLatch、CyclicBarrier、Semaphore
上次简单了解了多线程中锁的类型,今天要简单了解下多线程并发控制的一些工具类了. 1. 概念说明: CountDownLatch:相当于一个待执行线程计数器,当计数减为零时表示所有待执行线程都已执行完毕 ...
- java多线程 -- CountDownLatch 闭锁
CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown ...
- java多线程CountDownLatch
先上一个介绍:https://blog.csdn.net/shihuacai/article/details/8856370 用视频https://www.bilibili.com/video/av8 ...
- java多线程-CountDownLatch
简介 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数 ...
- java 多线程 CountDownLatch用法
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...
- (转)java 多线程 CountDownLatch用法
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...
- java多线程编程——同步器Exchanger
类java.util.concurrent.Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据.每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程 ...
- java多线程同步器
Java中多线程开发时,离不开线程的分工协作,常用的多线程的同步器有如下几种: 1.CountDownLatch 应用场景:等待一组线程任务完成后在继续执行当前线程. 用法:定义一个CountDown ...
- Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger
前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲 ...
随机推荐
- cocos2d-js 免安装在线版 粒子编辑器 particle editor particle builder 兼容pex和plist
http://onebyonedesign.com/flash/particleeditor/ 这个原来是为flash starling设计的粒子系统编辑器,但实际上,还是能兼容cocos2d的. 只 ...
- Oracle---->Join
最近使用ODI,其中有一个JOIN组件涉及到常见的几种JOIN类型,因此整理了下交叉连接和自然连接的区别. 一.概述 两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的.用来 ...
- MySQL优化系列
https://blog.csdn.net/Jack__Frost/article/details/73347688
- 转 安装php时报gd相关的错误(gd_ctx.c)
在安装php时,报如下错误 In file included from /kk/php-5.4.0/ext/gd/gd.c:103: /kk/php-5.4.0/ext/gd/gd_ctx.c: In ...
- where 1=1和 0=1 的作用
where 1=1; 这个条件始终为True,在不定数量查询条件情况下,1=1可以很方便的规范语句. 一.不用where 1=1 在多条件查询中的困扰 举个例子,如果您做查询页面,并且,可查询的选项有 ...
- jdbc连接Oracle连接字符串方法
- redis统计大key
–bigkeys redis-cli -h <host> -p <port> -n <db> --bigkeys 这条命令会从指定的 Redis DB 中持续采样, ...
- ios 中手势用法
pan拖动手势 - (void)viewDidLoad { [super viewDidLoad]; [self Pan]; // Do any additional setup after load ...
- oracle安装后tnsnames.ora内容
# tnsnames.ora Network Configuration File: D:\Develop\oracle11g\product\11.2.0\dbhome_1\network\admi ...
- iOS 设备屏幕上实时打印 Log 的小工具
需求 写这个小工具的想法,主要来源于很多团队都会用友盟.TalkingData 等第三方框架做自定义事件统计:不过统计代码加好之后,没有很好的方法来让测试工程师验证一下事件加上了没有,调用次数有没有重 ...