别人的牛逼的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