Phaser API的使用

Phaser 方法

int arriveAndAwaitAdvance(); 当前线程到达屏障parties值加1,在此等候条件满足后再向下一个屏障运行,条件不满足时线程呈现阻塞状态。
int arriveAndDeregister(); parties值减一;
int getPhase();获取已经到达第几个屏障;
boolean onAdvance(int phase, int registeredParties);通过新屏障的时候调用。返回true则屏障不等待,Phaser呈现无效/销毁状态,返回false则Phaser继续工作。

Phaser phaser = new Phaser(3) {
			@Override
			protected boolean onAdvance(int phase, int registeredParties) {
				 System.out.println("onAdvance方法被调用");
				return true;
			}
		};

int getRegisteredParties();获得注册的parties值;
int register();parties值 动态添加1;
int bulkRegister(int parties); 批量增加parties值;
int getArrivedParties();获得已经被使用了的parties个数。
getUnarrivedParties(); 获得没有被使用的parties个数。
int arrive(); parties值加1,并且不在屏障处等待(调用线程),直接执行下面代码。经过屏障后parties计数会被重置为0;其他线程不满足计数条件是还是呈现等待状态。
int awaitAdvance(int phase) ; 传入参数phase值和当前getPhase()方法返回值一样,则在屏障处等待,否则继续向下运行。注意:方法不参与parties值得计数操作,只具有判断功能。还是线程不可中断的。
int awaitAdvanceInterruptibly(int phase); 传入参数phase值和当前getPhase()方法返回值一样就等待,否则就继续执行下面的代码。线程时可中断的。
int awaitAdvanceInterruptibly(int phase, long timeout, TimeUnit unit);在指定的屏障数最大等待指定的时间,指定时间内屏障数未变则抛出异常。
void forceTermination(); 使Phaser屏障功能失效。
boolean isTerminated(); 判断Phaser对象是否已经呈现销毁状态。

awaitAdvance()

public class ThreadA extends Thread{

	private Phaser phaser;
	
	public ThreadA(Phaser phaser) {
		super();
		this.phaser = phaser;
	}

	@Override
	public void run() {
		 System.out.println(Thread.currentThread().getName()+" 开始 "+System.currentTimeMillis());
		 phaser.arriveAndAwaitAdvance();
		 System.out.println(Thread.currentThread().getName()+" 结束 "+System.currentTimeMillis());
	}
}

public class ThreadC extends Thread{

	private Phaser phaser;
	
	public ThreadC(Phaser phaser) {
		super();
		this.phaser = phaser;
	}

	@Override
	public void run() {
		 System.out.println(Thread.currentThread().getName()+" 开始  "+System.currentTimeMillis());
		 try {
			Thread.sleep(3000);
			System.out.println(Thread.currentThread().getName() + " phaser " + phaser.getPhase() + "  "
					+ System.currentTimeMillis());
			phaser.awaitAdvance(0);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 System.out.println(Thread.currentThread().getName()+" 结束  "+System.currentTimeMillis());
	}
}

public class ThreadD extends Thread {

	private Phaser phaser;

	public ThreadD(Phaser phaser) {
		super();
		this.phaser = phaser;
	}

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + " 开始  " + System.currentTimeMillis());
		try {
			Thread.sleep(5000);
			System.out.println(Thread.currentThread().getName() + " phaser " + phaser.getPhase() + "  "
					+ System.currentTimeMillis());
			phaser.arriveAndAwaitAdvance();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName() + " 结束  " + System.currentTimeMillis());
	}
}

public static void main(String[] args) {
		Phaser phaser = new Phaser(2);
		ThreadA a = new ThreadA(phaser);
		a.setName("线程A");
		a.start();
		ThreadC c = new ThreadC(phaser);
		c.setName("线程C");
		c.start();
		ThreadD d = new ThreadD(phaser);
		d.setName("线程D");
		d.start();
	}

相等的测试结果
线程A 开始 1601714914797
线程C 开始 1601714914799
线程D 开始 1601714914799
线程C phaser 0 1601714917799
线程D phaser 0 1601714919799
线程C 结束 1601714919799
线程A 结束 1601714919799
线程D 结束 1601714919799

不相等的测试结果
线程A 开始 1601715071795
线程C 开始 1601715071798
线程D 开始 1601715071799
线程C phaser 0 1601715074798
线程C 结束 1601715074798
线程D phaser 0 1601715076800
线程A 结束 1601715076800
线程D 结束 1601715076800

Phaser执行时机的控制
先将parties值加1,在做逻辑处理满足条件后再减1,达到控制Phaser对象的执行时机效果。

public class ThreadA extends Thread{

	private Phaser phaser;
	
	public ThreadA(Phaser phaser) {
		super();
		this.phaser = phaser;
	}

	@Override
	public void run() {
		 System.out.println(Thread.currentThread().getName()+" 开始 "+System.currentTimeMillis());
		 phaser.arriveAndAwaitAdvance();
		 System.out.println(Thread.currentThread().getName()+" 结束 "+System.currentTimeMillis());
	}
}

Phaser phaser = new Phaser(2);
	phaser.register();
	ThreadA a = new ThreadA(phaser);
	a.setName("线程A");
	a.start();
	ThreadA b = new ThreadA(phaser);
	b.setName("线程B");
	b.start();
	try {
		Thread.sleep(5000);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	phaser.arriveAndDeregister();

测试结果
线程B 开始 1601715266962
线程A 开始 1601715266962
线程B 结束 1601715271962
线程A 结束 1601715271962

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Phaser 3是一个流行的HTML5游戏框架,提供了丰富的API。下面列出了一些常用的API: 1. 游戏对象(Game Objects):Phaser 3提供了许多游戏对象,例如Sprite、Text、Image、Container等。你可以使用这些对象来创建游戏中的所有元素。 2. 场景(Scenes):场景是游戏中的一个独立部分。你可以在场景中添加游戏对象,处理用户输入,更新游戏状态等。 3. 物理引擎(Physics):Phaser 3内置了多种物理引擎,例如Arcade Physics、Matter.js等。你可以使用这些引擎来模拟物理效果,例如重力、碰撞等。 4. 动画(Animations):Phaser 3提供了强大的动画功能,你可以使用Tween、Timeline等API来创建动画效果。 5. 输入(Input):Phaser 3支持多种输入方式,例如鼠标、键盘、触摸屏等。你可以使用Input API来处理用户输入。 6. 声音(Audio):Phaser 3支持多种声音格式,例如MP3、OGG等。你可以使用Audio API来播放声音效果。 7. 网络(Networking):Phaser 3支持多种网络功能,例如HTTP请求、WebSocket通信等。你可以使用Networking API来实现多人游戏或在线排行榜等功能。 8. 插件(Plugins):Phaser 3支持插件机制,你可以使用现有插件或自己开发插件来扩展框架功能。 以上是一些常用的APIPhaser 3还提供了很多其他功能,例如粒子效果、位图处理、文本渲染等。你可以查看官方文档来了解更多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值