Java并发-同步器CyclicBarrier,Exchanger,Phaser

13 篇文章 0 订阅
6 篇文章 1 订阅

这篇主要模拟其他三个同步器:循环屏障(CyclicBarrier)、交换器(Exchanger)、Phaser


一、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 : 厨师






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值