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:回家