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

CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

实现如下:

package andy.thread.test;import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** @author Zhang,Tianyou* @version 2014年11月9日 下午14:16:01*/
public class CyclicBarrierTest {public static void main(String[] args) {ExecutorService service = Executors.newCachedThreadPool();final CyclicBarrier cb = new CyclicBarrier(3);for (int i = 0; i < 3; i++) {Runnable runnable = new Runnable() {public void run() {try {Thread.sleep((long) (Math.random() * 10000));System.out.println("线程"+ Thread.currentThread().getName()+ "即将到达集合地点1,当前已有"+ (cb.getNumberWaiting() + 1)+ "个已经到达,"+ (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊": "正在等候"));cb.await();Thread.sleep((long) (Math.random() * 10000));System.out.println("线程"+ Thread.currentThread().getName()+ "即将到达集合地点2,当前已有"+ (cb.getNumberWaiting() + 1)+ "个已经到达,"+ (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊": "正在等候"));cb.await();Thread.sleep((long) (Math.random() * 10000));System.out.println("线程"+ Thread.currentThread().getName()+ "即将到达集合地点3,当前已有"+ (cb.getNumberWaiting() + 1)+ "个已经到达,"+ (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊": "正在等候"));cb.await();} catch (Exception e) {e.printStackTrace();}}};service.execute(runnable);}service.shutdown();}
}

运行如下:

线程pool-1-thread-3即将到达集合地点1,当前已有1个已经到达,正在等候
线程pool-1-thread-1即将到达集合地点1,当前已有2个已经到达,正在等候
线程pool-1-thread-2即将到达集合地点1,当前已有3个已经到达,都到齐了,继续走啊
线程pool-1-thread-2即将到达集合地点2,当前已有1个已经到达,正在等候
线程pool-1-thread-1即将到达集合地点2,当前已有2个已经到达,正在等候
线程pool-1-thread-3即将到达集合地点2,当前已有3个已经到达,都到齐了,继续走啊
线程pool-1-thread-1即将到达集合地点3,当前已有1个已经到达,正在等候
线程pool-1-thread-2即将到达集合地点3,当前已有2个已经到达,正在等候
线程pool-1-thread-3即将到达集合地点3,当前已有3个已经到达,都到齐了,继续走啊

二、 Exchanger类

可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。

比如两个线程值在某一时刻交换

实现如下:

package andy.thread.test;import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** @author Zhang,Tianyou* @version 2014年11月9日 下午2:54:26*/public class ExchangerTest {public static void main(String[] args) {ExecutorService service = Executors.newCachedThreadPool();Exchanger<String> exchanger = new Exchanger<String>();service.execute(new Runnable() {public void run() {try {String value1 = "value 1";System.out.println("线程" + Thread.currentThread().getName()+ "正在把数据" + value1 + "换出去");Thread.sleep((long) (Math.random() * 10000));// 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。String value2 = (String) exchanger.exchange(value1);System.out.println("线程" + Thread.currentThread().getName()+ "换回的数据为" + value2);} catch (Exception e) {}}});service.execute(new Runnable() {public void run() {try {String value2 = "vlaue 2";System.out.println("线程" + Thread.currentThread().getName()+ "正在把数据" + value2 + "换出去");Thread.sleep((long) (Math.random() * 10000));String value1 = (String) exchanger.exchange(value2);System.out.println("线程" + Thread.currentThread().getName()+ "换回的数据为" + value1);} catch (Exception e) {}}});}}

交换了两个线程的值,结果如下:

线程pool-1-thread-1正在把数据value 1换出去
线程pool-1-thread-2正在把数据vlaue 2换出去
线程pool-1-thread-2换回的数据为value 1
线程pool-1-thread-1换回的数据为vlaue 2

多线程之CyclicBarrier工具类和Exchanger工具类相关推荐

  1. Java多线程之CyclicBarrier用法

    Java多线程之CyclicBarrier用法 本文目录 CyclicBarrier的基本概念 CyclicBarrier的案例:集齐7颗龙珠就可以召唤神龙 1. CyclicBarrier的基本概念 ...

  2. java中多线程之CAS(compareAndSet),Unsafe类大白话详解.

    java中多线程之CAS(compareAndSet),Unsafe类大白话详解 什么是CAS CAS原理 Unsafe类:     什么是CAS 比较并交换 在学习CAS之前,我们先了解一下JMM. ...

  3. (九)java多线程之CyclicBarrier

    目录 引言 理论 例子 打赏 本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://gi ...

  4. 【多线程笔记02】多线程之CyclicBarrier的介绍和使用

    这篇文章,主要介绍多线程中CyclicBarrier的用法. 目录 一.CyclicBarrier介绍 1.1.什么是CyclicBarrier 1.2.CyclicBarrier执行流程图 1.3. ...

  5. (十)java多线程之CountDownLatch

    目录 引言 理论 例子 打赏 本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://gi ...

  6. J.U.C之并发工具类:Exchanger

    本文来说下J.U.C之并发工具类:Exchanger 文章目录 概述 应用示例 实现分析 exchange()方法 本文小结 概述 前面分别介绍了CyclicBarrier.CountDownLatc ...

  7. HQChart实战教程24 - 自定义K线画图工具设置框(线段类)

    HQChart实战教程24 - 自定义K线画图工具设置框 画图工具 步骤 监听画图工具选中事件 点击事件回调 1. 回调参数说明 2. 图形实例类说明 Symbol Period Vaule Line ...

  8. Java并发工具类(4):Exchanger相关介绍

    Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法交换数 ...

  9. 多线程之CompletableFuture和ParallelStream应该使用哪个?

    多线程之CompletableFuture和ParallelStream应该使用哪个 简介 实例场景 测试代码 开始测试 总结 备注 简介 随着用户对性能和体验的要求越来越高,异步在项目中用的也就越来 ...

  10. cyclicbarrier java_Java并发编程之CyclicBarrier和线程池的使用

    原标题:Java并发编程之CyclicBarrier和线程池的使用 下面我们来讲述一下线程池和CyclicBarrier的使用和对比. 一.场景描述 有四个游戏玩爱好者玩游戏,游戏中有三个关卡,每一个 ...

最新文章

  1. 一眼识别这是什么鸟,比人类还厉害的“我们来找茬”十级选手诞生!
  2. 重磅!韩国学者发布最新《人工智能元宇宙》综述论文
  3. silverlight RadGridView总结二(转载)
  4. 刘未鹏谈如何学习算法
  5. Linux IO模型漫谈(1)
  6. 【Python】Matplotlib绘图中文乱码问题的解决方案
  7. windows7原版iso镜像_一定收藏,常用操作系统原版下载地址整理,Win7 Win10 Deepin...
  8. matlab中模块封装,MATLAB/simulink模块的封装
  9. mysql示例employees数据库
  10. 最近的问题汇总(至2010/10/6 12:00)
  11. WCF之旅读书笔记(2):WCF如何通过Binding进行通信
  12. wap2app检测版本升级
  13. Shell - 常用压缩文件处理 zip、gz、tar、rar
  14. “特质波动率之谜”(Idiosyncratic Volatility),用Python计算特质波动率
  15. 网页设计志愿招募平台模块
  16. 如何快速将WPS表格或者excel数据将表格转化为json
  17. 欢乐的票圈重构——九宫格控件(上)
  18. ERP BOM 展开方式
  19. Pytest-Pytest框架的使用
  20. Excel 权限错误和应用程序8000401A错误解决办法

热门文章

  1. Postman 导出 curl命令 到命令行运行 Mac OS
  2. Google Code Review 浏览评论中的CL
  3. 易筋SpringBoot 2.1 | 第廿篇:SpringBoot的复杂JPA以及源码解析
  4. deepin mysql管理工具_[LINUX]DeepIn下基础开发环境搭建
  5. python 中的[::-1]和[:-1]
  6. 网络拓扑图自动生成_SAP ABAP关键字语法图和ABAP代码自动生成工具Code Composer
  7. android studio for android learning (十七) Toast使用详解
  8. vofuria的开发(4)更换目标图片(target)
  9. Neural NILM: Deep Neural Networks Applied to Energy Disaggregation
  10. pandas DataFrame 根据多列的值做判断,生成新的列值