Phaser表示阶段同步器,用来解决控制多个线程分阶段共同完成任务的情景问题。我们可以将其看成一个一个的阶段,每个阶段都有需要执行的线程任务,任务执行完毕就进入下一个阶段。所以Phaser特别适合使用在重复执行或者重用的情况。
例子package com.test.juc.lock; import java.util.Random; import java.util.concurrent.Phaser; import java.util.concurrent.TimeUnit; public class PhaserTest { static ClimbingPhaser cp = new ClimbingPhaser(); public static void main(String[] args) { cp.bulkRegister(5); for(int i = 0; i < 5; i++) { new Thread(() -> { Person p = new Person(Thread.currentThread().getName()); p.begin(); cp.arriveAndAwaitAdvance(); p.climbing(); cp.arriveAndAwaitAdvance(); }).start(); } } static class ClimbingPhaser extends Phaser { @Override protected boolean onAdvance(int phase, int registeredParties) { switch (phase) { case 0: System.out.println("所有人到达山脚"); return false; case 1: System.out.println("山顶集合完毕"); return true; default: return true; } } } static void milliSleep(int milli) { try { TimeUnit.MILLISECONDS.sleep(milli); } catch (InterruptedException e) { e.printStackTrace(); } } static class Person { String name; public Person(String name) { this.name = name; } void begin() { milliSleep(new Random().nextInt(1000)); System.out.println(name + "到达山脚"); } void climbing() { milliSleep(new Random().nextInt(1000)); System.out.println(name + "爬上山顶"); } } }
执行结果 Thread-0到达山脚 Thread-1到达山脚 Thread-4到达山脚 Thread-3到达山脚 Thread-2到达山脚 所有人到达山脚 Thread-1爬上山顶 Thread-2爬上山顶 Thread-3爬上山顶 Thread-4爬上山顶 Thread-0爬上山顶 山顶集合完毕
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)