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同步器的更多相关文章

  1. 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例

    java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...

  2. Java多线程-CountDownLatch、CyclicBarrier、Semaphore

    上次简单了解了多线程中锁的类型,今天要简单了解下多线程并发控制的一些工具类了. 1. 概念说明: CountDownLatch:相当于一个待执行线程计数器,当计数减为零时表示所有待执行线程都已执行完毕 ...

  3. java多线程 -- CountDownLatch 闭锁

    CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown ...

  4. java多线程CountDownLatch

    先上一个介绍:https://blog.csdn.net/shihuacai/article/details/8856370 用视频https://www.bilibili.com/video/av8 ...

  5. java多线程-CountDownLatch

    简介 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数 ...

  6. java 多线程 CountDownLatch用法

    CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...

  7. (转)java 多线程 CountDownLatch用法

    CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...

  8. java多线程编程——同步器Exchanger

    类java.util.concurrent.Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据.每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程 ...

  9. java多线程同步器

    Java中多线程开发时,离不开线程的分工协作,常用的多线程的同步器有如下几种: 1.CountDownLatch 应用场景:等待一组线程任务完成后在继续执行当前线程. 用法:定义一个CountDown ...

  10. Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger

    前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲 ...

随机推荐

  1. MySQL查看当前用户、存储引擎、日志

    #查看MySQL的当前用户 mysql> SELECT USER(); +----------------+ | USER() | +----------------+ | root@local ...

  2. HTML:Hyper Text Markup Language 超文本标记语言

    1.HTML是什么? *Hyper Text Markup Language 超文本标记语言 *Hyper Text:超链接.把不同空间的资源,整合在一起,形成逻辑上的网状结构. *Markup La ...

  3. Spring学习笔记六:Spring整合Hibernate

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6785323.html  前言:整合概述 Spring整合Hibernate主要是把Hibernate中常用的S ...

  4. 〖Linux〗使用纯命令行来操作VBOX(宿主机不需要X11 Server)

    1. Linux安装vbox,略过 2. 查看已安装扩展插件 VBoxManage list extpacks 3. 创建一个vm: VBoxManage createvm --name " ...

  5. python之函数用法startswith()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法startswith() #http://www.runoob.com/python/ ...

  6. Java 安装和变量环境配置

    //1.分别安装sdk和jre,需要2个均安装才是完整的 //1)jdk_8u60_windows_i586_V8.0.600.27.1440040557 //2)jre_8u60_windows_i ...

  7. 三种常用的MySQL建表语句

    MySQL建表语句是最基础的SQL语句之一,下面就为您介绍最常用的三种MySQL建表语句,如果您对MySQL建表语句方面感兴趣的话,不妨一看. 1.最简单的: CREATE TABLE t1(    ...

  8. win32下编译glog

    既然编译第三方库了,google提供的VSproject是老版本的,构建不好升级.所以还是用cmake是王道. 采用out of source 编译,  以下是编译脚本bat: mkdir build ...

  9. 架构-虚拟路由器冗余协议【原理篇】VRRP详解

    转自:http://zhaoyuqiang.blog.51cto.com/6328846/1166840/ 为什么要使用VRRP技术 我们知道,为了实现不同子网之间的设备通信,需要配置路由.目前常用的 ...

  10. Oracle 9i 10g 11g 区别的转载

    下面看看9i.10g.11g版本的区别 Oracle 10g比9i多的新特性?        1. 10g支持网格计算,即多台结点服务器利用高速网络组成一个虚拟的高性能服务器,负载在整个 网格中衡(L ...