【并发编程】- CyclicBarrier 屏障重置性(2)

91 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情

接着上一篇文章 # # 【并发编程】- CyclicBarrier 屏障重置性

CyclicBarrier下 使用方法isBroken()检查屏障损坏性

将原来代码出现异常改成了interrupt()中断。

实现代码如下:

public class CyclicBarrierBrokenService {
    private CyclicBarrier cyclicBarrier;

    public CyclicBarrierBrokenService(CyclicBarrier cyclicBarrier){
        super();
        this.cyclicBarrier=cyclicBarrier;
    }

    private void startRun(int count){
        try {
        System.out.println(Thread.currentThread().getName()+" 到了 在等待其他人都到了开始起跑");
        if(Thread.currentThread().getName().equals("Thread-2")){
                System.out.println("Thread-2 进来了");
                Thread.sleep(5000);
                Thread.currentThread().interrupt();
        }
        cyclicBarrier.await();
        System.out.println(" 都到了,开始跑!");
        System.out.println(Thread.currentThread().getName()+" 到达终点,并结束第 "+count+"赛段");
        } catch (InterruptedException e) {
            System.out.println("进入了InterruptionedException e"+cyclicBarrier.isBroken());
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            System.out.println("进入了BrokenBarrierException e"+cyclicBarrier.isBroken());
            e.printStackTrace();
        }
    }

    public void call(){
        for (int i = 0; i < 1; i++) {
            startRun(i+1);
        }
    }
}

运行结果如下:

Thread-0 到了 在等待其他人都到了开始起跑
Thread-1 到了 在等待其他人都到了开始起跑
Thread-2 到了 在等待其他人都到了开始起跑
Thread-2 进来了
Thread-3 到了 在等待其他人都到了开始起跑
进入了BrokenBarrierException e true
进入了InterruptionedException e true
进入了BrokenBarrierException e true
进入了BrokenBarrierException e true
java.lang.InterruptedException
	at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:211)
	at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362)
	at com.ozx.concurrentprogram.cyclicBarrier.service.CyclicBarrierBrokenService.startRun(CyclicBarrierBrokenService.java:28)
	at com.ozx.concurrentprogram.cyclicBarrier.service.CyclicBarrierBrokenService.call(CyclicBarrierBrokenService.java:42)
	at com.ozx.concurrentprogram.cyclicBarrier.entity.BrokenThread.run(BrokenThread.java:22)
	at java.lang.Thread.run(Thread.java:748)
java.util.concurrent.BrokenBarrierException
	at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:250)
	at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362)
	at com.ozx.concurrentprogram.cyclicBarrier.service.CyclicBarrierBrokenService.startRun(CyclicBarrierBrokenService.java:28)
	at com.ozx.concurrentprogram.cyclicBarrier.service.CyclicBarrierBrokenService.call(CyclicBarrierBrokenService.java:42)
	at com.ozx.concurrentprogram.cyclicBarrier.entity.BrokenThread.run(BrokenThread.java:22)
	at java.lang.Thread.run(Thread.java:748)
java.util.concurrent.BrokenBarrierException
	at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:250)
	at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362)
	at com.ozx.concurrentprogram.cyclicBarrier.service.CyclicBarrierBrokenService.startRun(CyclicBarrierBrokenService.java:28)
	at com.ozx.concurrentprogram.cyclicBarrier.service.CyclicBarrierBrokenService.call(CyclicBarrierBrokenService.java:42)
	at com.ozx.concurrentprogram.cyclicBarrier.entity.BrokenThread.run(BrokenThread.java:22)
	at java.lang.Thread.run(Thread.java:748)
java.util.concurrent.BrokenBarrierException
	at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:250)
	at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362)
	at com.ozx.concurrentprogram.cyclicBarrier.service.CyclicBarrierBrokenService.startRun(CyclicBarrierBrokenService.java:28)
	at com.ozx.concurrentprogram.cyclicBarrier.service.CyclicBarrierBrokenService.call(CyclicBarrierBrokenService.java:42)
	at com.ozx.concurrentprogram.cyclicBarrier.entity.BrokenThread.run(BrokenThread.java:22)
	at java.lang.Thread.run(Thread.java:748)

​ 从运行结果来看,全部线程都进入了catch语句块,其中Thread-2线程进入了Interrupted Exception的catch语句块,其他3个线程进入了BrokenBarrierException的catch语句块。

​ CyclicBarrier对于线程的中断interrupt处理会使用全有或者全无的破坏模型,就是如果有一个线程由于中断或者超时提前离开了屏障点,其他所有在屏障点等待的线程也会抛出BrokenBarrierException或者InterruptionedException异常,并且离开屏障点。