Java并发-同步器CyclicBarrier,Exchanger,Phaser
2016-05-15 22:01
661 查看
这篇主要模拟其他三个同步器:循环屏障(CyclicBarrier)、交换器(Exchanger)、Phaser
一、CyclicBarrier同步器
特征:
1. 适用于只有多个线程都到达预定点时才可以继续执行(比如斗地主,需要等齐三个人才开始)
2. CyclicBarrier(int num) :等待线程的数量
3. CyclicBarrier(int num, Runnable action) :等待线程的数量以及所有线程到达后的操作
4. await() : 到达临界点后暂停线程
以下代码模拟该模型:
二、 交换器(Exchanger)同步器
此处模拟略!暂时没用到!
三、Phaser同步器
特征:
1. 工作方式与CyclicBarrier类似,但是可以定义多个阶段
2. Phaser()/Phaser(int num) : 使用指定0/num个party创建Phaser
3. register() : 注册party
4. arriveAndAdvance() : 到达时等待到所有party到达
5. arriveAndDeregister() : 到达时注销线程自己
以下代码模拟该同步器:
执行结果:
一、CyclicBarrier同步器
特征:
1. 适用于只有多个线程都到达预定点时才可以继续执行(比如斗地主,需要等齐三个人才开始)
2. CyclicBarrier(int num) :等待线程的数量
3. CyclicBarrier(int num, Runnable action) :等待线程的数量以及所有线程到达后的操作
4. await() : 到达临界点后暂停线程
以下代码模拟该模型:
package com.concurrent.src; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; /** * 斗地主:需要等待齐三个玩家游戏才开始 * @author admin * */ public class Cdemo { public static void main(String[] args) { // 创建循环屏障,条件满足时就执行runnable CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() { @Override public void run() { System.out.println("Game start..."); } }); // 有A,B,C三个玩家 new Player(cyclicBarrier, "A").start(); new Player(cyclicBarrier, "B").start(); new Player(cyclicBarrier, "C").start(); } } class Player extends Thread { private CyclicBarrier cyclicBarrier; public Player(CyclicBarrier cyclicBarrier,String name) { setName(name); this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println(getName() + " is waiting other player...."); try { // 屏障处等待 cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } }执行结果:
A is waiting other player.... C is waiting other player.... B is waiting other player.... Game start...
二、 交换器(Exchanger)同步器
此处模拟略!暂时没用到!
三、Phaser同步器
特征:
1. 工作方式与CyclicBarrier类似,但是可以定义多个阶段
2. Phaser()/Phaser(int num) : 使用指定0/num个party创建Phaser
3. register() : 注册party
4. arriveAndAdvance() : 到达时等待到所有party到达
5. arriveAndDeregister() : 到达时注销线程自己
以下代码模拟该同步器:
package com.concurrent.src; import java.util.concurrent.Phaser; /** * 一个一个订单处理 * @author admin * */ public class Ddemo { public static void main(String[] args) { Phaser phaser = new Phaser(1); System.out.println("starting..."); // 点餐用餐中会包含多个人员服务 new Worker(phaser, "服务员").start(); new Worker(phaser, "打荷员").start(); new Worker(phaser, "厨师").start(); for (int i = 1; i <= 3; i++) { phaser.arriveAndAwaitAdvance(); System.out.println("Order " + i + " finished"); } // 注销 phaser.arriveAndDeregister(); System.out.println("Order all done "); } } class Worker extends Thread { private Phaser phaser; public Worker(Phaser phaser,String name) { setName(name); this.phaser = phaser; } @Override public void run() { for (int i = 1; i <= 3; i++) { System.out.println( "current order is : " + i + " : " + getName()); if (i == 3) { phaser.arriveAndDeregister(); } else { phaser.arriveAndAwaitAdvance(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
执行结果:
starting... Order 1 finished Order 2 finished Order 3 finished Order all done current order is : 1 : 打荷员 current order is : 1 : 服务员 current order is : 1 : 厨师 current order is : 2 : 打荷员 current order is : 2 : 服务员 current order is : 2 : 厨师 current order is : 3 : 打荷员 current order is : 3 : 服务员 current order is : 3 : 厨师
相关文章推荐
- C#线程间不能调用剪切板的解决方法
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- 探究在C++程序并发时保护共享数据的问题
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#通过Semaphore类控制线程队列的方法
- C#多线程处理多个队列数据的方法
- 在ASP.NET 2.0中操作数据之二十一:实现开放式并发
- C#实现线程安全的简易日志记录方法
- C#中线程同步对象的方法分析
- Nodejs实战心得之eventproxy模块控制并发
- ASP.NET线程相关配置
- 并发环境下mysql插入检查方案