还是看一段代码,下边输出什么?
package com.test.java;
class MyThread3 implements Runnable{
String name;
public MyThread3(){}
public MyThread3(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 7; i++) {
System.out.println(name+"正在做第"+(i+1)+"个俯卧撑。");
}
}
}
public class TestConcurrent3 {
public static void main(String[] args) {
Thread kaka = new Thread(new MyThread3("卡卡"));
kaka.start();
Thread beckham = new Thread(new MyThread3("小贝"));
beckham.start();
Thread owen = new Thread(new MyThread3("欧文"));
owen.start();
System.out.println("guys, good job!");
}
}
很遗憾,输出是各种无序,本来期待"guys, good job!"在最后一行,但是却发现输出是整个乱的,像这样...
这个时候就是CyclicBarrier的大展身手的时候了。
CyclicBarrier是一个同步辅助类,允许一组线程相互等待,直到到达一个共同的barrier point。如果一组线程需要不定时地相互等待,这个时候就可以用到CyclicBarrier。CyclicBarrier之所以带“Cyclic”前缀,是因为当所有相互等待的线程释放后,Barrier可以被重复利用。
改造一下代码...
package com.test.java;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
class MyThread3 implements Runnable{
String name;
CyclicBarrier cyclic;
public MyThread3(){}
public MyThread3(String name) {
this.name = name;
}
public MyThread3(String name, CyclicBarrier cyclic) {
this.name = name;
this.cyclic = cyclic;
}
@Override
public void run() {
for (int i = 0; i < 7; i++) {
System.out.println(name+"正在做第"+(i+1)+"个俯卧撑。");
}
try {
cyclic.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
class MyThread3_barrierAction implements Runnable{
@Override
public void run() {
System.out.println("guys, good job!");
}
}
public class TestConcurrent3 {
public static void main(String[] args) {
CyclicBarrier cyclic = new CyclicBarrier(4, new MyThread3_barrierAction());
Thread kaka = new Thread(new MyThread3("卡卡", cyclic));
kaka.start();
Thread beckham = new Thread(new MyThread3("小贝", cyclic));
beckham.start();
Thread owen = new Thread(new MyThread3("欧文", cyclic));
owen.start();
try {
cyclic.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
但是总觉得代码好像少了什么东西 .. ...