代码
import java.util.concurrent.Phaser;
//Phaser 相位器
//模拟CyclicBarrier循环屏障的作用
public class PhaCyclicBarrier {
public static void main(String[] args) {
// Phaser phaser = new Phaser(5);
// getInfo(phaser);
test2();
}
public static void test2(){
Phaser phaser = new Phaser(5); //初始五个阶段 (泛指同时五个线程处于运行状态)
getInfo(phaser);
for (int i = 0; i <10 ; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(new Double(Math.random()*3000).longValue());
System.out.println(Thread.currentThread().getName()+"玩家准备就绪");
//等同于(new CyclicBarrier(3)).await()方法 表示阻塞, 待每个阶段运行完毕,在释放所用线程
//5个线程执行arriveAndAwaitAdvance 即一个阶段结束
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName()+"选择英雄");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start(); //start方法 开启线程
}
}
private static void getInfo(Phaser phaser){
System.out.println("阶段"+phaser.getPhase());
System.out.println("到达数"+phaser.getArrivedParties());
System.out.println("未到达"+phaser.getUnarrivedParties());
System.out.println("总数"+phaser.getRegisteredParties());
}
}
import java.util.concurrent.Phaser;
//Phaser 相位器
//模拟CountDownLatch倒计数器的作用
public class PhaCountDownLatch {
public static void main(String[] args) {
// Phaser phaser = new Phaser(5);
// getInfo(phaser);
test2();
}
public static void test2(){
Phaser phaser = new Phaser(5); //初始五个阶段 (泛指同时五个线程处于运行状态)
getInfo(phaser);
for (int i = 0; i <10 ; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(new Double(Math.random()*3000).longValue());
System.out.println(Thread.currentThread().getName()+"玩家准备就绪");
//等同于 (new CountDownLatch()).countDown()方法 达到并不阻塞
phaser.arrive();
// System.out.println(Thread.currentThread().getName()+"选择英雄");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start(); //start方法 开启线程
}
//方法中的参数表示 处于第几阶段
//等同于countDownLatch.await(); 先阻塞该线程 等到计数器为0(五个线程都arrive)时在进行执行
phaser.awaitAdvance(0);
System.out.println("游戏开始0");
getInfo(phaser);
phaser.awaitAdvance(1);
System.out.println("游戏开始1");
}
private static void getInfo(Phaser phaser){
System.out.println("阶段"+phaser.getPhase());
System.out.println("到达数"+phaser.getArrivedParties());
System.out.println("未到达"+phaser.getUnarrivedParties());
System.out.println("总数"+phaser.getRegisteredParties());
}
}
理解
phaser.arriveAndAdvance 大家都到了,并且都进行等待 类似于CyclicBarrier中的await方法
phaser.arrive 到达并不阻塞 类似于CountDownLatch计数器中的countdown方法
phaser.awaitAdvance(参数 第几阶段)类似于计数器中的await方法
可以模拟CyclicBarrier循环屏障以及CountDownLatch计数器的作用
初始是0阶段
CyclicBarrier 相较于CountDownLatch没有countdown方法,有await方法
获取到当前处于第几阶段 phaser.getPhase
线程注册并且注销
这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!!!
欢饮加入技术群聊!!!