当前位置: 代码迷 >> 综合 >> JUC之Phaser-多线程与高并发
  详细解决方案

JUC之Phaser-多线程与高并发

热度:64   发布时间:2024-02-26 15:07:27.0

Phaser支持对于多个线程,阻塞控制统一完成到某个阶段后,再继续进行下一阶段的操作。即所有线程都完成当前阶段后,才可以进入下一阶段进行操作。

以一个婚礼流程为例,比如分为到场、吃饭、离场等流程,必须所有人步调一致,人到齐才能开饭。


p0 到达现场!
新娘 到达现场!
p3 到达现场!
p1 到达现场!
p2 到达现场!
新郎 到达现场!
p4 到达现场!
所有人到齐了!7新娘 吃完!
p2 吃完!
p0 吃完!
p1 吃完!
p3 吃完!
p4 吃完!
新郎 吃完!
所有人吃完了!7p3 离开!
新郎 离开!
p4 离开!
p1 离开!
p0 离开!
p2 离开!
新娘 离开!
所有人离开了!7新郎 洞房!
新娘 洞房!
婚礼结束!新郎新娘抱抱!2Process finished with exit code 0
package basic.aqs.phaser;import java.util.Random;
import java.util.concurrent.Phaser;
import java.util.concurrent.TimeUnit;public class TestPhaser {static Random r = new Random();static MarriagePhaser phaser = new MarriagePhaser();static void milliSleep(int milli) {try {TimeUnit.MILLISECONDS.sleep(milli);} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) {phaser.bulkRegister(7);for(int i=0; i<5; i++) {new Thread(new Person("p" + i)).start();}new Thread(new Person("新郎")).start();new Thread(new Person("新娘")).start();}static class MarriagePhaser extends Phaser {@Overrideprotected boolean onAdvance(int phase, int registeredParties) {switch (phase) {case 0:System.out.println("所有人到齐了!" + registeredParties);System.out.println();return false;case 1:System.out.println("所有人吃完了!" + registeredParties);System.out.println();return false;case 2:System.out.println("所有人离开了!" + registeredParties);System.out.println();return false;case 3:System.out.println("婚礼结束!新郎新娘抱抱!" + registeredParties);return true;default:return true;}}}static class Person implements Runnable {String name;public Person(String name) {this.name = name;}public void arrive() {milliSleep(r.nextInt(1000));System.out.printf("%s 到达现场!\n", name);phaser.arriveAndAwaitAdvance();}public void eat() {milliSleep(r.nextInt(1000));System.out.printf("%s 吃完!\n", name);phaser.arriveAndAwaitAdvance();}public void leave() {milliSleep(r.nextInt(1000));System.out.printf("%s 离开!\n", name);phaser.arriveAndAwaitAdvance();}private void hug() {if(name.equals("新郎") || name.equals("新娘")) {milliSleep(r.nextInt(1000));System.out.printf("%s 洞房!\n", name);phaser.arriveAndAwaitAdvance();} else {phaser.arriveAndDeregister();//phaser.register()}}@Overridepublic void run() {arrive();eat();leave();hug();}}
}