PhaserDemo

1646 ワード

package com.smart.thread;
import java.io.IOException; import java.util.concurrent.Phaser;
/**
  • タスクは複数のフェーズに分けることができ、バッチタスクを複数のスレッドで処理することが望ましい.各フェーズについて、複数のスレッドは同時に実行することができ、
  • しかし、前の段階のタスクが完了してから、後のタスクが開始されることを保証したい.
  • このようなシナリオは、各CyclicBarrierが1段階のタスクのすべての完了を待つ責任を負う複数のCyclicBarrierを使用して実現することができる.
  • しかしCyclicBarrierを使用する欠点は、合計何段階あるかを明確に知る必要があり、同時に並列のタスク数を事前に定義する必要があることである.
  • で、動的に変更できません.Phaserはこの2つの問題を同時に解決することができる.
  • Created by jinxiaoyu on 17/4/11. */public class PhaserDemo { public static void main(String[] args) throws IOException { int parties = 3; final int phases = 4; final Phaser phaser = new Phaser(parties) { @Override protected boolean onAdvance(int phase, int registeredParties) { System.out.println("====== Phase : "+ phase + "======"); return registeredParties == 0; } };
     for(int i = 0; i < parties; i++) {
         final int threadId = i;
         final Thread thread = new Thread() {
             @Override
             public void run() {
                 for (int phase = 0; phase < phases; phase++) {
                     System.out.println(String.format("Thread %s, phase %s", threadId, phase));
                     phaser.arriveAndAwaitAdvance();
                 }
             }
         };
         thread.start();
     }
    
    } }

  • Thread 1, phase 0 Thread 2, phase 0 Thread 0, phase 0 ====== Phase : 0 ====== Thread 1, phase 1 Thread 0, phase 1 Thread 2, phase 1 ====== Phase : 1 ====== Thread 0, phase 2 Thread 1, phase 2 Thread 2, phase 2 ====== Phase : 2 ====== Thread 1, phase 3 Thread 0, phase 3 Thread 2, phase 3 ====== Phase : 3 ======