20.Phaser

作者: 段段小胖砸 | 来源:发表于2021-10-21 11:23 被阅读0次

用Phaser替代CyclicBarrier和CountDownLatch.从JDK7开始,新增了一个同步工具类Phaser,其功能比CyclicBarrier和CountDownLatch更加强大。
state变量解析:Phaser没有基于AQS来实现,但具备AQS(AbstractQueuedSynchronizer)的核心特性:state变量、CAS操作、阻塞队列。先从state变量说起

代替CountDownLatch:

public static void main(String[] args) { 
    Phaser phaser = new Phaser(5); 
    for (int i = 0; i < 5; i++) { 
        new Thread("线程-" + (i + 1)) { 
            private final Random random = new Random(); 
            @Override public void run() { 
                System.out.println(getName() + " - 开始运行"); 
                try {
                    Thread.sleep(random.nextInt(1000)); 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                }
                System.out.println(getName() + " - 运行结束"); 
                  phaser.arrive(); 
            } }.start(); 
         }
          System.out.println("线程启动完毕"); 
          phaser.awaitAdvance(phaser.getPhase());
          System.out.println("线程运行结束");
 } }

** Phaser新特性:**

  • 动态调整线程个数:
register() // 注册一个 
bulkRegister(int parties) // 注册多个 
arriveAndDeregister() // 解除注册
  • 层次Phaser:多个Phaser可以组成树状结构

代替CyclicBarrier:

public static void main(String[] args) { 
    Phaser phaser = new Phaser(5); 
    for (int i = 0; i < 5; i++) { 
        new MyThread("线程-" + (i + 1), phaser).start(); 
    }
    phaser.awaitAdvance(0); 
}

public class MyThread extends Thread { 
    private final Phaser phaser; 
    private final Random random = new Random(); 
    public MyThread(String name, Phaser phaser) { 
        super(name); 
        this.phaser = phaser; 
    }
    @Override 
    public void run() { 
        System.out.println(getName() + " - 开始向公司出发"); 
        slowly(); 
        System.out.println(getName() + " - 已经到达公司"); 
        // 到达同步点,等待其他线程 
        phaser.arriveAndAwaitAdvance(); 
        System.out.println(getName() + " - 开始笔试"); 
        slowly(); 
        System.out.println(getName() + " - 笔试结束"); 
        // 到达同步点,等待其他线程 
        phaser.arriveAndAwaitAdvance();
        System.out.println(getName() + " - 开始面试"); 
        slowly(); 
        System.out.println(getName() + " - 面试结束"); 
    }
    private void slowly() { 
        try {
            Thread.sleep(random.nextInt(1000)); 
        } catch (InterruptedException e) { 
            e.printStackTrace(); 
        } 
} }

相关文章

  • 20.Phaser

    用Phaser替代CyclicBarrier和CountDownLatch.从JDK7开始,新增了一个同步工具类P...

网友评论

      本文标题:20.Phaser

      本文链接:https://www.haomeiwen.com/subject/ovrtaltx.html