欢迎来到《并发王者课》,本文是该系列文章中的第21篇,铂金中的第8篇。
在上一篇文章中,我们介绍了CountDownLatch的用法。在协调多线程的开始和结束时,CountDownLatch是个非常不错的选择。而本文即将给你介绍的CyclicBarrier则更加有趣,它在能力上和CountDownLatch既有相似之处,又有着明显的不同,值得你一览究竟。本文会先从场景上带你理解问题,再去理解CyclicBarrier提供的方案。
一、CyclicBarrier初体验
1. 峡谷森林里的爱情
在峡谷的江湖中,不仅有生杀予夺和刀光剑影,还有着美妙的爱情故事。
峡谷战神铠曾经在危急关头救了大乔,这一出英雄救美让他们擦除了爱情的火花,有事没事两人就在峡谷中的各个角落幽会。其中,峡谷森林就是他们常去的地方,谁先到就等另一个,两人都到齐后,再一起玩耍。
这里头,有两个重点。一是他们要相互等待,二是都到齐后再玩耍。现在,我们试想一下,如果用代码来模拟这个场景的话,你打算怎么做。有的同学可能会说,两个人(线程)的等待很好处理。可是,如果是三人呢?
所以,这个场景问题可以概括为:多个线程相互等待,到齐后再执行特定动作。
接下来,我们就通过CyclicBarrier来模拟解决这个场景的问题,直观感受CyclicBarrier的用法。
在下面这段代码中,我们定义了一个幽会地点(appointmentPlace),以及大乔和铠这两个主人公。在他们都达到幽会地点后,我们输出一句包含三朵玫瑰