一起养成写作习惯!这是我参与「掘金日新计划 · 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异常,并且离开屏障点。