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下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲 ...
随机推荐
- JS或AS中处理ARGB、RGBA颜色值时要小心
(0xffffffff)>>24; //-1 (0xffffffff / 2)>>23; argb颜色需要一个无符号整数uint才能存储,如果首位是F,那么第一个二进制位就是1 ...
- 使用fuel6.0自己主动安装openstack-juno版本号(2)
上篇中fuel_master已经安装完毕.接下来我们介绍怎样新建一个openstack环境. 1,在web界面中新建openstack环境: 点击主界面的加入button,新建openstack环境. ...
- V-rep学习笔记:碰撞检测与距离计算
V-REP可以在几何组件中快速判断各种干扰与碰撞,以及计算多个组件间的最小距离. 碰撞检测 V-REP可以检测两个碰撞体实体(Collidable objects are objects that c ...
- 读取csv文件并打印其结果
In [5]: import pandas as pd In [6]: df=pd.read_csv('https://raw.githubusercontent.com/alstat/Analysi ...
- python之模块colorsys颜色转换模块 暂不了解
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块colorsys #颜色转换模块 #colorsys import colorsys 针对 ...
- Web前端知识体系
看到一篇不错的文章,拿来收藏和分享. 原文:http://mp.weixin.qq.com/s/UFTfdE7LYhHquWEzwZKLCQ Web前端技术由html.css和 javascript三 ...
- sparkmllib矩阵向量
Spark MLlib底层的向量.矩阵运算使用了Breeze库,Breeze库提供了Vector/Matrix的实现以及相应计算的接口(Linalg).但是在MLlib里面同时也提供了Vector和L ...
- Spring Boot 使用Jar打包发布, 并使用 Embedded Jetty/Tomcat 容器
Jar包发布 在项目pom.xml中, 如果继承了Spring Boot的starter parent, 那么默认已经包含打包需要的plugins了, 设置为jar就能直接打包成包含依赖的可执行的ja ...
- CPP复习笔记 3
--------------- CPP函数编译原理和成员函数的实现 从上节的分析中能够看出.对象的内存中仅仅保留了成员变量,除此之外没有不论什么其它信息,程序运行时不知道 stu 的类型为 Stude ...
- (原)CosFace/AM-Softmax及其mxnet代码
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/8525241.html 论文: CosFace: Large Margin Cosine Loss fo ...