Phaser

Phaser是JDK1.7引入的一个同步工具类,适用于一些需要分阶段的任务处理。一种人物可以分为多个阶段,现希望保证只有前面一个阶段的任务完成后才能开始后面的任务。这种场景可以使用多个CyclicBarrier来实现,但是需要明确知道总共有多少个阶段,且无法动态修改。Phaser可以同时解决这两个问题。

同步器 作用
CountDownLatch 倒数计时器
CyclicBarrier 循环栅栏,初始时设定参与线程数,当线程到达栅栏后,会等待其他线程的到达。当到达栅栏的总数满足指定数后,所有等待的线程继续执行。
Phaser 多阶段栅栏,初始时设定参与线程数,也可以中途注册/注销参与者,当到达的参与者数量满足栅栏设定的数量后,会进行阶段升级。
import java.io.IOException;
import java.util.concurrent.Phaser;
public class PhaserDemo {
	public static void main(String[] args) throws IOException {
	    int parties = 3;
	    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++) {
			int threadId = i;
			Thread thread = new Thread(() -> {
				for(int phase = 0; phase < phases; phase++) {
					System.out.println(String.format("Thread %s, phase %s", threadId, phase));
					phaser.arriveAndAwaitAdvance();
				}
			});
			thread.start();
		}
	}
}

执行结果:
Thread 0, phase 0
Thread 1, phase 0
Thread 2, phase 0
====== Phase : 0 ======
Thread 2, phase 1
Thread 0, phase 1
Thread 1, phase 1
====== Phase : 1 ======
Thread 1, phase 2
Thread 2, phase 2
Thread 0, phase 2
====== Phase : 2 ======
Thread 0, phase 3
Thread 1, phase 3
Thread 2, phase 3
====== Phase : 3 ======

878416911-5b72af098eb7b_articlex

todo:https://segmentfault.com/a/1190000015979879

comments powered by Disqus