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

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

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

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


解决方法:

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为3,只启动AB两个线程,睡眠5秒后注销一个parties

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

       Phaser phaser = new Phaser(3);

       MyThread threadA = new MyThread(phaser);

       threadA.setName("A");

       threadA.start();


       MyThread threadB = new MyThread(phaser);

       threadB.setName("B");

       threadB.start();

       System.out.println("注销前parties数:"+phaser.getRegisteredParties());


       Thread.sleep(5000);

       phaser.arriveAndDeregister();

       System.out.println("注销后parties数:"+phaser.getRegisteredParties());

   }



3.结果打印

注销前parties数:3

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

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

注销后parties数:2

线程B通过屏障时间:1590473428757

线程A通过屏障时间:1590473428757


可见线程A和线程B都执行arriveAndAwaitAdvance方法后进入等待状态,由于设置了parties是3,所以要3个线程组队才能一起通过屏障继续执行,但目前只有两个线程的话只能通过arriveAndDeregister()使parties减1,等待中的线程AB才可以继续往下执行。


0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交