1、CountDownLatch(倒计数器)
使用场景:主线程需要等待多个子线程都执行完了以后,再执行下去。
实现过程:
1)new一个CountDownLatch(),把子线程的个数作为参数,在CountDownLatch内部会维护一个count计数器,对这个count计数器加锁,保证不会被多个线程同时修改;
2)执行每个子线程,并且在子线程执行完后,执行CountDownLatch的countdown()方法,把count计数器减1;
3)所有子线程代码后面,执行CountDownLatch的await()方法,等待count计数器变成0,变成0说明所有子线程都执行完了,可以往下继续执行了。
2、CyclicBarrier(同步屏障)
使用场景:在多个子线程的执行过程中,分别设置一个障碍点,只有当所有的子线程都执行到各自的障碍点时,各子线程才能继续往下执行。
实现过程:
1)new一个CyclicBarrier,把子线程的个数作为参数;
2)执行每个子线程,并且在子线程的执行过程中,添加CyclicBarrier的await()方法,表示等待其它子线程执行到各自的await障碍点;
3)所有子线程执行到各自的await()方法时,表示大家都到达障碍点了,大家继续往下执行。
3、CountDownLatch与CyclicBarrier区别
1)CountDownLatch是主线程被阻塞,等待所有子线程执行完;而CyclicBarrier是子线程被阻塞,等待其它子线程执行完;
2)CountDownLatch的计数器是一次性的;CyclicBarrier可以在子线程中设置多次await障碍,每一个障碍都能够触发子线程的相互等待。
4、CountDownLatch与join区别
CounDownLatch和join都能实现线程间的等待,但在使用的时候两者存在区别:
CountDownLatch的控制粒度比join更细,join是等待子线程任务全部执行完才往下执行;而CounDownLatch不需要执行完子线程中的全部任务,只需要在执行完部分任务后,加countDown()方法即可;
网友评论