CyclicBarrier和CountDownLatch有什么区别?

两者最核心的区别:

  • CountDownLatch是一次性的,而CyclicBarrier则可以多次设置屏障,实现重复利用;
  • CountDownLatch中的各个子线程不可以等待其他线程,只能完成自己的任务;而CyclicBarrier中的各个线程可以等待其他线程

它们区别用一个表格整理:

CyclicBarrierCountDownLatch
CyclicBarrier是可重用的,其中的线程会等待所有的线程完成任务。届时,屏障将被拆除,并可以选择性地做一些特定的动作。CountDownLatch是一次性的,不同的线程在同一个计数器上工作,直到计数器为0.
CyclicBarrier面向的是线程数CountDownLatch面向的是任务数
在使用CyclicBarrier时,你必须在构造中指定参与协作的线程数,这些线程必须调用await()方法使用CountDownLatch时,则必须要指定任务数,至于这些任务由哪些线程完成无关紧要
CyclicBarrier可以在所有的线程释放后重新使用CountDownLatch在计数器为0时不能再使用
在CyclicBarrier中,如果某个线程遇到了中断、超时等问题时,则处于await的线程都会出现问题在CountDownLatch中,如果某个线程出现问题,其他线程不受影响

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, va常见问题