控制多个线程达到同一条件结束阻塞往下执行,设定值,调用await次数达到设定值,所有await往下执行。容易异常,reset可重置。
Demo:
/**
* 2019年8月9日上午10:04:26
*/
package testThreadUtil.testCyclicBarrier;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* @author XWF
*
*/
public class TestCyclicBarrier {
private static String str = "";
// private static CyclicBarrier cyclicBarrier = new CyclicBarrier(2);//参数>0(可以reset重置)
private static CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> {//带action,阻塞个数达到后执行(由最后一个await线程执行)
str.length();//测试异常
System.out.println("所有await停止阻塞。");
});
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) {
System.out.println("parties:" + cyclicBarrier.getParties());
System.out.println("======1=====");
test1();
threadsleep(1000);
System.out.println("======2=====");
test2();
threadsleep(1000);
System.out.println("======3=====");
test3();
threadsleep(1000);
System.out.println("======4=====");
test4();
threadsleep(1000);
System.out.println("main finished");
}
public static void test1() {
awaitThread(1, cyclicBarrier);
awaitThread(2, cyclicBarrier);
awaitThread(3, cyclicBarrier);
}
public static void test2() {//超时异常
cyclicBarrier.reset();
awaitThread(4, cyclicBarrier);//其他线程超时
awaitTimeThread(5, cyclicBarrier, 1);//超时
System.out.println("Broken?" + cyclicBarrier.isBroken());
threadsleep(1100);
System.out.println("已经超时异常了,Broken?" + cyclicBarrier.isBroken());
awaitThread(6, cyclicBarrier);//barrier已经毁坏
}
public static void test3() {//reset异常
cyclicBarrier.reset();
awaitThread(7, cyclicBarrier);//test reset
threadsleep(100);
cyclicBarrier.reset();
}
public static void test4() {//action异常
cyclicBarrier.reset();
str = null;
awaitThread(8, cyclicBarrier);
awaitThread(9, cyclicBarrier);
awaitThread(10, cyclicBarrier);//action由该线程执行,异常也由该线程抛出
}
public static void awaitThread(final int i, CyclicBarrier cyclicBarrier) {
new Thread(() -> {
try {
cyclicBarrier.await();
System.out.println("停止阻塞-" + i);
} catch (InterruptedException e) {
//当前线程等待时被中断抛出
System.out.println("x被中断-" + i);
} catch (BrokenBarrierException e) {
//当前线程等待时其他线程中断或者超时
//当barrier被reset时
//调用await时barrier已经毁坏时
//回调action抛出异常时
System.out.println("xbarrier毁坏-" + i);
}
}).start();
}
public static void awaitTimeThread(final int i, CyclicBarrier cyclicBarrier, int awaitSeconds) {
new Thread(() -> {
try {
cyclicBarrier.await(awaitSeconds, TimeUnit.SECONDS);//带超时时间
System.out.println("停止超时阻塞-" + i);
} catch (InterruptedException e) {
System.out.println("x被中断=" + i);
} catch (BrokenBarrierException e) {
System.out.println("xbarrier毁坏=" + i);
} catch (TimeoutException e) {
//超时抛出异常
System.out.println("x超时异常=" + i);
}
}).start();
}
public static void threadsleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
结果: