Java如何使用并发工具CyclicBarrier呢?

戚薇 Java经验 发布时间:2023-06-25 08:59:09 阅读数:8185 1
下文笔者讲述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();
		}
	}
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202306/16876547826888.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者