[size=medium]cyclicBarrier是有自动重置功能的,我们可以用这个功能来实现分阶段:
还是之前的需求:
开启3个线程,分别打印字母a,b,c各10次,然后进入下一阶段打印后面的字母d,e,f各10次,然后再进入下一阶段.......以此类推,直到整个字母表全部打印完毕。
下面是代码,可以看到是有点麻烦的
cyclicBarrier是没有明确的分段功能的,坑爹的是如果一个线程不await,其他线程是不能进入下个阶段的。然后你要自己比较精确的去什么await,什么时候退出。
原因是Phaser有个总的状态管理,但是cyclicBarrier没有,如果单纯用await来代替Phaser的arrive,那么会有部分线程一直阻塞。
[/size]
还是之前的需求:
开启3个线程,分别打印字母a,b,c各10次,然后进入下一阶段打印后面的字母d,e,f各10次,然后再进入下一阶段.......以此类推,直到整个字母表全部打印完毕。
下面是代码,可以看到是有点麻烦的
cyclicBarrier是没有明确的分段功能的,坑爹的是如果一个线程不await,其他线程是不能进入下个阶段的。然后你要自己比较精确的去什么await,什么时候退出。
原因是Phaser有个总的状态管理,但是cyclicBarrier没有,如果单纯用await来代替Phaser的arrive,那么会有部分线程一直阻塞。
[/size]
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();
}
}
}
}