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; } };
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 ======
import java.io.IOException; import java.util.concurrent.Phaser;
/**
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 ======