线程同步辅助类CyclicBarrier

发布时间:2017-1-22 22:19:42 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"线程同步辅助类CyclicBarrier ",主要涉及到线程同步辅助类CyclicBarrier 方面的内容,对于线程同步辅助类CyclicBarrier 感兴趣的同学可以参考一下。

CyclicBarrier 是一个可重置的多路同步点,在某些并行编程风格中很有用。

集合点同步:CyclicBarrier

多条线程同时执行一个阶段性任务时,相互等待,等到最后一个线程执行完阶段后,才能一起执行下一段任务.

场景:

和朋友组队去游玩,再爬山,在吃饭,再KTV

 

第一个人爬山到顶之后要等待其他的三个人也到顶再下山吃饭,

第一个人吃完饭之后要等待之后的三个人也吃晚饭,再去KTV

这四个人相当于四条线程,而这些任务就设定了一一个个的点,这种点称之为集合点.

CyclicBarrier就是在集合点同步.

CyclicBarrier和CountDownLatch很相似,但是CyclicBarrier有一个reset能回到初始状态, CountDownLatch不可以.

还有一个很明显的区别是, CyclicBarrier同一类线程之间相互等待.

CountDownLatch是其他类线程等待另一类线程来唤醒它们...

 

 CyclicBarrierDemo.java

 1 import java.util.Random; 2 import java.util.concurrent.BrokenBarrierException; 3 import java.util.concurrent.CyclicBarrier; 4 import java.util.concurrent.TimeUnit; 5  6 public class CyclicBarrierDemo { 7  8     public static void main(String[] args) { 9         final CyclicBarrier cb = new CyclicBarrier(4);10         11         for (int i = 0; i < 4; i++) {12             13             new Thread(new Runnable() {14                 15                 @Override16                 public void run() {17                     18                     try {19                         System.out.println(Thread.currentThread().getName()+" :爬山。。。");20                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);21                         System.out.println(Thread.currentThread().getName()+" :到达山顶了。。。");22                         cb.await();//await 就是集合点  等待,直到计数器变为0为止23                         24                         System.out.println(Thread.currentThread().getName()+" :吃饭。。。");25                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);26                         System.out.println(Thread.currentThread().getName()+" :吃完饭了。。。");27                         cb.await();//等待,直到计数器变为0为止28                         29                         System.out.println(Thread.currentThread().getName()+" :KTV。。。");30                         TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);31                         System.out.println(Thread.currentThread().getName()+" :唱完歌了。。。");32                         cb.await();//等待,直到计数器变为0为止33                         34                         System.out.println(Thread.currentThread().getName()+":回家");35                         36                     } catch (InterruptedException e) {37                         e.printStackTrace();38                     } catch (BrokenBarrierException e) {39                         e.printStackTrace();40                     }41                     42                 }43             }).start();44         }45         46     }47 }

 运行结果:

Thread-0 :爬山。。。Thread-2 :爬山。。。Thread-1 :爬山。。。Thread-3 :爬山。。。Thread-2 :到达山顶了。。。Thread-1 :到达山顶了。。。Thread-0 :到达山顶了。。。Thread-3 :到达山顶了。。。Thread-3 :吃饭。。。Thread-2 :吃饭。。。Thread-0 :吃饭。。。Thread-1 :吃饭。。。Thread-3 :吃完饭了。。。Thread-2 :吃完饭了。。。Thread-1 :吃完饭了。。。Thread-0 :吃完饭了。。。Thread-0 :KTV。。。Thread-2 :KTV。。。Thread-3 :KTV。。。Thread-1 :KTV。。。Thread-3 :唱完歌了。。。Thread-1 :唱完歌了。。。Thread-0 :唱完歌了。。。Thread-2 :唱完歌了。。。Thread-2:回家Thread-3:回家Thread-1:回家Thread-0:回家

上一篇:CSS之flex布局
下一篇:Mediawiki

相关文章

相关评论