JavaDemo——并发工具之CyclicBarrier

控制多个线程达到同一条件结束阻塞往下执行,设定值,调用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();
		}
	}
}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值