JUC--Parser

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

猜你喜欢

转载自shifulong.iteye.com/blog/2241724
JUC