1. 背景

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

2. 示范代码

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

  1. package com.clzhang.sample.thread;
  2.  
  3. import java.util.concurrent.BrokenBarrierException;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. import java.util.concurrent.CyclicBarrier;
  7.  
  8. public class SyncCyclicBarrier {
  9. class PokerPlayer implements Runnable {
  10. private CyclicBarrier barrier;
  11. private String name;
  12.  
  13. public PokerPlayer(CyclicBarrier barrier, String name) {
  14. this.barrier = barrier;
  15. this.name = name;
  16. }
  17.  
  18. @Override
  19. public void run() {
  20. try {
  21. Thread.sleep((long) (Math.random() * 3000));
  22. System.out.println(name + "坐好了...");
  23.  
  24. // 在所有参与者都执行到这儿之后,再执行await()语句之后的代码。
  25. barrier.await();
  26.  
  27. System.out.println(name + "已经发牌!");
  28. } catch (InterruptedException e) {
  29. e.printStackTrace();
  30. } catch (BrokenBarrierException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }
  35.  
  36. public static void main(String[] args) throws Exception {
  37. final int PER_TABLE_PLAYERS = 4; // 多少人够开一桌的
  38. final int TOTAL_TABLES= 5; // 共计开多少桌

  39. CyclicBarrier barrier = new CyclicBarrier(PER_TABLE_PLAYERS);
  40.  
  41. SyncCyclicBarrier ins = new SyncCyclicBarrier();
  42. ExecutorService executorPool = Executors.newFixedThreadPool(PER_TABLE_PLAYERS);
  43. for(int i=0; i<PER_TABLE_PLAYERS*TOTAL_TABLES; i++) {
  44. executorPool.execute(ins.new PokerPlayer(barrier, i +"号玩家"));
  45. }
  46.  
  47. executorPool.shutdown();
  48. }
  49. }

输出

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. CentOS6.x 图形界面(gnome)安装

    CentOS6默认的安装选项 Desktop :基本的桌面系统,包括常用的桌面软件,如文档查看工具. Minimal Desktop :基本的桌面系统,包含的软件更少. Minimal :基本的系统, ...

  2. Oracle SQLPLUS提示符设置

    Oracle SQLPLUS提示符设置 把Oracle sqlplus提示符修改为如下,可以提醒你所在的用户模式,减少误操作. set sqlprompt _user'@'_connect_ident ...

  3. ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

    [root@ldaptest openldap]# ldapadd -x -D "cn=admin,dc=ultrapower,dc=com" -W -f /tmp/base.ld ...

  4. 网页屏蔽Backspace事件,输入框不屏蔽

    document.onkeydown = function (e) { var code; if (!e){ var e = window.event;} if (e.keyCode){ code = ...

  5. 【php将日志写入一个按时间天来分类的文件】put_file_contents()

    具体参考php官方文档:http://php.net/manual/zh/function.file-put-contents.php 具体参数:成功返回插入数据的字节数,失败返回false 使用示例 ...

  6. SQLserver视图修改sql

    语法: alter view dbo.视图名 as 更新后的视图SQL go 举个栗子: 原视图名为YOUR_VIEW其中SQL为:  select * form TableA 更新视图: alter ...

  7. Linux init进程学习 转

    http://oss.org.cn/kernel-book/ch13/13.6.1.htm init进程的建立 Linux将要建立的第一个进程是init进程,建立该进程是以调用kernel_threa ...

  8. java 实现唯一ID生成器

      2014-11-08 内容存档在evernote,笔记名"java 实现唯一ID生成器"

  9. Ant scp upload文件至linux server(用java调用Ant api)

    1.要准备的jar包:ant.jar,ant-jsch.jar code: package com.test.utils; import org.apache.tools.ant.Project; i ...

  10. 使用嵌入式关系型SQLite数据库存储数据

    除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库—SQLite, 1.SQLite3支持 ...