java高級---->Thread之Phaser的使用


  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類功能更加強大,建議使用。

 

友情鏈接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM