`

java用cyclicBarrier来实现Phaser的分段功能

 
阅读更多
cyclicBarrier是有自动重置功能的,我们可以用这个功能来实现分阶段:
还是之前的需求:
开启3个线程,分别打印字母a,b,c各10次,然后进入下一阶段打印后面的字母d,e,f各10次,然后再进入下一阶段.......以此类推,直到整个字母表全部打印完毕。

下面是代码,可以看到是有点麻烦的
cyclicBarrier是没有明确的分段功能的,坑爹的是如果一个线程不await,其他线程是不能进入下个阶段的。然后你要自己比较精确的去什么await,什么时候退出。
原因是Phaser有个总的状态管理,但是cyclicBarrier没有,如果单纯用await来代替Phaser的arrive,那么会有部分线程一直阻塞。


package com.eyu.ahxy.module.thread;

import java.util.concurrent.CyclicBarrier;

public class MyTest2 {

	public static void main(String[] args) throws Exception {

		CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
		char a = 'a';
		for (int i = 0; i < 3; i++) { // 创建并启动3个线程
			new MyThread2((char) (a + i), cyclicBarrier).start();
		}
	}
}

class MyThread2 extends Thread {
	private char c;
	private CyclicBarrier cyclicBarrier;

	public MyThread2(char c, CyclicBarrier cyclicBarrier) {
		this.c = c;
		this.cyclicBarrier = cyclicBarrier;
	}

	@Override
	public void run() {
		while (true) {
			if (c <= 'z') {
				String string = "";
				for (int i = 0; i < 10; i++) {
					string += c;
				}
				string += "\n";
				System.out.print(string);
			}
			// y是最后一轮的第一个打印, 结束退出
			if (c >= 'y') {
				return;
			}
			c = (char) (c + 3);
			try {
				// 等待下一轮
				cyclicBarrier.await();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics