Java如何使用并发工具CyclicBarrier呢?
下文笔者讲述CyclicBarrier的方法及示例分享
学习完本篇之后,你将掌握CyclicBarrier对象的使用方法及示例
学习完本篇之后,你将掌握CyclicBarrier对象的使用方法及示例
CyclicBarrier对象的场景: 有若干个线程 如: 有五个线程,需要它们都到达了某一个点之后才能开始一起执行 也就是说假如其中只有四个线程到达了这个点 还差一个线程没到达 此时这四个线程都会进入等待状态 直到第五个线程也到达了这个点之后 这五个线程才开始一起进行执行状态 这个临界点就是使用CyclicBarrier进行设置例:CyclicBarrier示例
package com.java265;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
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();
}
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


