CountDownLatch和CyclicBarrier的区别、案例分析
1.CountDownLatch和CyclicBarrier的区别
(1)CountDownLatch的线程数不大于计数器,而CyclicBarrier的线程数与计数器相等。
(2)CountDownLatch的放行由其他线程来控制,而CyclicBarrier的放行由线程自己来控制。
2.CountDownLatch和CyclicBarrier的案例分析
通过一场考试来分析CountDownLatch和CyclicBarrier的第二个区别。案例如下:
一个班级有10个学生,他们要参加期末英语考试。
考试规则:
(1)10个考生全部到齐之后即可开始考试,
(2)考卷上一共有两个问答题,分别在两份试卷上,做完第一道题才能做第二道题。
(3)学生答完第一道题按红灯,答完第二道题按绿灯。
(4)监考老师看见所有学生的红灯都亮后,监考老师收取第一份试卷。
(5)所有学生的第二道题都做完之后考生才可以离开教室。
10个考生可以当做我们代码中的10个线程,监考老师作为其他线程。
以下为这场考试中涉及到的CountDownLatch和CyclicBarrier部分:
- 10个考生全部到齐之后开考,这个过程即为CyclicBarrier。
- 10个学生全部答完第一道题目后,监考老师收取第一份试卷,这个过程即为CountDownLatch。
- 10个学生全部答完第二道题后,即所有人的绿灯都亮后,大家才可以离开教室,这个过程即为CyclicBarrier。
分析:
(1)能否开考是由考生是否全部到齐决定的。10个学生没有全部到齐,是不可以开考的,也就是在阻塞状态。
(2)考生答完第一道题目,按红灯,相当于代码中的countDown(),之后学生还可以接着做第二道题,并不会被阻塞。收卷的监考老师即为我们代码中的其他线程,他会等到所有学生的红灯都亮起后开始收卷。
总结:
由以上可知,CountDownLatch中的线程只是在满足某个条件之后,对其他线程进行通知,并不会影响自己本身线程的执行,而CyclicBarrier中的线程必须等到所有组内线程都满足某个条件之后,大家才能执行之后的动作。