1. 背景

CyclicBarrier类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

2. 示范代码

下面这段代码演示了打扑克游戏,够4个人则开桌,共计开5桌:

package com.clzhang.sample.thread;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.CyclicBarrier; public class SyncCyclicBarrier {
class PokerPlayer implements Runnable {
private CyclicBarrier barrier;
private String name; public PokerPlayer(CyclicBarrier barrier, String name) {
this.barrier = barrier;
this.name = name;
} @Override
public void run() {
try {
Thread.sleep((long) (Math.random() * 3000));
System.out.println(name + "坐好了..."); // 在所有参与者都执行到这儿之后,再执行await()语句之后的代码。
barrier.await(); System.out.println(name + "已经发牌!");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) throws Exception {
final int PER_TABLE_PLAYERS = 4; // 多少人够开一桌的
final int TOTAL_TABLES= 5; // 共计开多少桌

CyclicBarrier barrier = new CyclicBarrier(PER_TABLE_PLAYERS); SyncCyclicBarrier ins = new SyncCyclicBarrier();
ExecutorService executorPool = Executors.newFixedThreadPool(PER_TABLE_PLAYERS);
for(int i=0; i<PER_TABLE_PLAYERS*TOTAL_TABLES; i++) {
executorPool.execute(ins.new PokerPlayer(barrier, i +"号玩家"));
} executorPool.shutdown();
}
}

输出

3号玩家坐好了...
1号玩家坐好了...
0号玩家坐好了...
2号玩家坐好了...
2号玩家已经发牌!
3号玩家已经发牌!
0号玩家已经发牌!
1号玩家已经发牌!
4号玩家坐好了...
7号玩家坐好了...
6号玩家坐好了...
5号玩家坐好了...
4号玩家已经发牌!
5号玩家已经发牌!
7号玩家已经发牌!
6号玩家已经发牌!
11号玩家坐好了...
9号玩家坐好了...
8号玩家坐好了...
10号玩家坐好了...
11号玩家已经发牌!
10号玩家已经发牌!
9号玩家已经发牌!
8号玩家已经发牌!
13号玩家坐好了...
14号玩家坐好了...
15号玩家坐好了...
12号玩家坐好了...
13号玩家已经发牌!
14号玩家已经发牌!
12号玩家已经发牌!
15号玩家已经发牌!
16号玩家坐好了...
18号玩家坐好了...
19号玩家坐好了...
17号玩家坐好了...
16号玩家已经发牌!
18号玩家已经发牌!
17号玩家已经发牌!
19号玩家已经发牌!

Java:多线程,CyclicBarrier同步器的更多相关文章

  1. java多线程-CyclicBarrier

    介绍 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBa ...

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

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

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

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

  4. java多线程同步器

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

  5. Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例

    概要 本章介绍JUC包中的CyclicBarrier锁.内容包括:CyclicBarrier简介CyclicBarrier数据结构CyclicBarrier源码分析(基于JDK1.7.0_40)Cyc ...

  6. Java多线程-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier

    Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁 ...

  7. JAVA多线程提高十:同步工具CyclicBarrier与CountDownLatch

    今天继续学习其它的同步工具:CyclicBarrier与CountDownLatch 一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公 ...

  8. java多线程10:并发工具类CountDownLatch、CyclicBarrier和Semaphore

    在JDK的并发包(java.util.concurrent下)中给开发者提供了几个非常有用的并发工具类,让用户不需要再去关心如何在并发场景下写出同时兼顾线程安全性与高效率的代码. 本文分别介绍Coun ...

  9. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  10. Java多线程系列--“JUC锁”01之 框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...

随机推荐

  1. Mybatis-Generator自动生成XML文件以及接口和实体类

    整合了MySQL和Oracle配置文件生成方法 这个是整个文件夹的下载地址:http://www.codepeople.cn/download 主要给大家介绍一下generatorConfig.xml ...

  2. Shell编程初步

      一:Hello World 新建一个文件,命名时以 .sh 为后缀.每个bash文件开头第一行表名文件类型: #!/bin/bash 然后在下面输入代码. 比如输出hello world: #!/ ...

  3. OpenERP 7中 openerp-server.conf 的解释

    服务器启动配置 – 通用项 程序代码: [选择] # Admin password for creating, restoring and backing up databases admin_pas ...

  4. Linux下几款C++程序中的内存泄露检查工具

    https://blog.csdn.net/gatieme/article/details/51959654

  5. VTK中模型的旋转与平移

    当从外界读入STL等三维模型时,其会按照它内部的坐标位置进行显示.因此它的位置和大小是确定的.但是在实际应用中,有可能需要人为地对这个模型在空间中进行旋转.平移或缩放等操作.VTK中有许多和旋转.平移 ...

  6. PHP5.4 需要添加的configure参数

    ./configure --prefix=/usr/local/php --with-gd=/usr/local/gd --with-jpeg-dir=/usr/local/jpeg --with-p ...

  7. RHEL7-openldap安装配置二(客户端安装配置)

    LDAP用户登录流程: 当在客户端输入账号登录系统时,系统根据/etc/nsswitch.conf配置文件获取账号查找顺序,然后再根据PAM配置文件调用相关模块,对账号(/etc/passwd)及密码 ...

  8. 找不到android-support-v4 包的解决办法

    有时候在开发过程中,总是会遇到一些莫名奇妙的错误,或者在使用fragement和viewpage的时候,就会出现下面这个错误,如果出现找不到android-support-v4 包的时候,可以使用下面 ...

  9. 将 numeric 转换为数据类型 numeric 时出现算术溢出错误

    保存数据时控制台报错: Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 将 numeric 转换为数据类型 numeric 时出 ...

  10. webshell文件下载器

    拥有webshell的服务器可以ping通主机A,这就表明webshell可以向主机A post一些数据. 在主机A上开启一个接受文件的http服务,在webshell中使用文件上传命令进行上传. 主 ...