Java 7的并发包中推出了
Phaser,其功能跟CyclicBarrier和CountDownLatch有些重叠,但是提供了更灵活的用法,例如支持动态调整注册任务的数量等
别人的牛逼的blok: http://whitesock.iteye.com/blog/1135457
package com.test.uuu;
import java.util.concurrent.Phaser;
/**
* Phaser:阶段的意思
* 有两个概念:phase & party ,phase 表明当前执行的阶段,party当前注册了的线程数量
* <p/>
* 创建三个线程分别打印从'a'开始的的字母表,每个字母打印十次,
* 三个线程打印完之后在继续打印,知道26个字母打印完
* 打印结果如下
*/
public class PhaserTest {
public static void main(String[] args) {
System.out.println("start");
Phaser phaser = new Phaser(3) {
//1. return true -> parser就会终止
//2. 每一个阶段执行完都会调用onAdvance
@Override
protected boolean onAdvance(int phase, int registeredParties) {
System.out.printf("\n======phase : %s , parties : %s============分割线========================\n", phase, registeredParties);
return registeredParties == 1; // 表示parser注册的线程数为1的时候终止parser
// return phase >=3; //表示执行完第四阶段就会终止parser
}
};
//PhaserTest.PhaserThread s = new PhaserTest().new PhaserThread('c',null);
for (int i = 0; i < 3; i++) {
//顺便复习下 内部类 和 静态内部类 初始化的知识
new Thread(new PhaserTest().new PhaserThread((char) ('a' + i), phaser)).start();
}
//主线程注册到phaser中
phaser.register();
while (!phaser.isTerminated()) {
phaser.arriveAndAwaitAdvance();
}
System.out.println("end");
}
class PhaserThread implements Runnable {
private char letter;
private Phaser phaser;
public PhaserThread(char letter, Phaser phaser) {
this.letter = letter;
this.phaser = phaser;
}
public void run() {
while (!phaser.isTerminated()) {
for (int i = 0; i < 10; i++) {
System.out.print(letter + " ");
}
letter = (char) (letter + 3);
if (letter > 'z') {
//取消当前线程的注册
phaser.arriveAndDeregister();
break;
} else {
//执行完当前阶段,等待下一阶段
phaser.arriveAndAwaitAdvance();
}
}
}
}
}
结果如下
start
a a a b b b b b b b b b b a a a a a a a c c c c c c c c c c
======phase : 0 , parties : 4============分割线========================
f d f e e e e e e e e e e f d f d f d d d d d d d f f f f f
======phase : 1 , parties : 4============分割线========================
i i i i i i i i i i g g g g g g g g g g h h h h h h h h h h
======phase : 2 , parties : 4============分割线========================
k k k k k l j j l k l j l k k k l l l l l l j k j j j j j j
======phase : 3 , parties : 4============分割线========================
m m m m m m m o n o m o o o o o n n n n n n o o o m n n n m
======phase : 4 , parties : 4============分割线========================
p q q q q q q q q q q r p r p r p r p p p r p r p p r r r r
======phase : 5 , parties : 4============分割线========================
u s s s t s s s u s t s u s s t u t u t u t u t u u u t t t
======phase : 6 , parties : 4============分割线========================
w w w w w w w w w w v x x x x x x x x x x v v v v v v v v v
======phase : 7 , parties : 3============分割线========================
y y z z z y z y z z z z z z y y y y y y
======phase : 8 , parties : 1============分割线========================
end