码上敲享录 > java高并发常见问题 > java并发包之Phaser的onAdvance用法实例演示,秒懂

java并发包之Phaser的onAdvance用法实例演示,秒懂

上一章章节目录下一章 2020-05-26已有1644人阅读 评论(0)

java并发包之Phaser的onAdvance用法实例演示,秒懂


解决方法:

1.线程类

package com.wlg;

import java.util.concurrent.Phaser;


public class MyThread extends  Thread {

   public Phaser phaserser;


   public MyThread( Phaser phaserser) {

       this.phaserser = phaserser;

   }


   @Override

   public void run() {

       System.out.println("线程"+Thread.currentThread().getName()+"到达屏障开始等待时间:"+System.currentTimeMillis());

       phaserser.arriveAndAwaitAdvance();

       System.out.println("线程"+Thread.currentThread().getName()+"通过屏障时间:"+System.currentTimeMillis());

   }

}



2.测试方法,给Phaser对象设置parties为2,每隔5秒分别启动ABC3个线程

public static void main( String[] args ) throws InterruptedException {

        Phaser phaser = new Phaser(2){

           protected boolean onAdvance(int phase, int registeredParties) {

               System.out.println("当前是第"+phase+"个屏障");

               return  true;

           }

       };

       MyThread threadA = new MyThread(phaser);

       threadA.setName("A");

       threadA.start();

       Thread.sleep(5000);

       MyThread threadB = new MyThread(phaser);

       threadB.setName("B");

       threadB.start();


       Thread.sleep(5000);

       MyThread threadC = new MyThread(phaser);

       threadC.setName("C");

       threadC.start();

   }


3.结果打印,以下是onAdvance返回true的情况

线程A到达屏障开始等待时间:1590474826424

线程B到达屏障开始等待时间:1590474831424

当前是第0个屏障

线程B通过屏障时间:1590474831424

线程A通过屏障时间:1590474831424

线程C到达屏障开始等待时间:1590474836425

线程C通过屏障时间:1590474836425


可见线程A和线程B都执行arriveAndAwaitAdvance方法后一起通过屏障那个时刻,就会执行onAdvance里面的代码,执行完之后A和B线程再执行各自arriveAndAwaitAdvance方法后面的代码,onAdvance返回false说明下一次两个线程需要组队才能穿过屏障,如果返回true,下一次线程到达屏障时无需等待组队,可以继续执行代码。


0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交