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 @Override 16 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:回家