Phaser提供了動態增parties計數,這點比CyclicBarrier類操作parties更加方便。它是jdk1.7新增的類,今天我們就來學習一下它的用法。塵埃落定之后,回憶別來挑撥。
Phaser的簡單使用
一、Phaser的arriveAndAwaitAdvance方法使用
package com.linux.thread.thread; import java.util.concurrent.Phaser; public class PhaserRun1 { public static void main(String[] args) { Phaser phaser = new Phaser(3); for (int i = 0; i < 3; i++) { ThreadA threadA = new ThreadA(phaser); threadA.start(); } } static class ThreadA extends Thread { private Phaser phaser; public ThreadA(Phaser phaser) { this.phaser = phaser; } @Override public void run() { System.out.println(Thread.currentThread().getName() + " A begin " + System.currentTimeMillis()); phaser.arriveAndAwaitAdvance(); System.out.println(Thread.currentThread().getName() + " A end " + System.currentTimeMillis()); } } }
一次運行的結果如下:
Thread-0 A begin 1501381934550 Thread-1 A begin 1501381934550 Thread-2 A begin 1501381934550 Thread-1 A end 1501381934550 Thread-2 A end 1501381934550 Thread-0 A end 1501381934560
修改上述的main方法的代碼如下:
public static void main(String[] args) throws InterruptedException{ Phaser phaser = new Phaser(3); phaser.register(); for (int i = 0; i < 3; i++) { ThreadA threadA = new ThreadA(phaser); threadA.start(); } Thread.sleep(5000); phaser.arriveAndDeregister(); }
運行的效果如下:
通過若干個方法來控制多個線程之間同步運行的效果,還可以實現針對某一個線程取消同步運行的效果,而且支持在指定屏障處等待,在等待時還支持中斷或非中斷等功能,使用Java並發類對線程進行分組同步控制時,Phaser比CyclicBarrier類功能更加強大,建議使用。
友情鏈接