Java CountDownLatch面试题

1. CountDownLatch是什么?

CountDownLatch是一个同步辅助类,允许一个或多个线程等待一组其他线程完成操作后再执行。

2. CountDownLatch的工作原理是什么?

CountDownLatch通过一个计数器来工作,初始值设置为需要等待的操作数量。每当一个操作完成时,计数器减1,当计数器到达0时,所有等待的线程被唤醒。

3. CountDownLatch的主要方法有哪些?

  • CountDownLatch(int count):构造函数,初始化计数器。
  • countDown():当前线程完成操作后调用,使计数器减1。
  • await():等待计数器到达0,如果未到达0,则阻塞。
  • getCount():返回当前计数器的值。

4. CountDownLatch和CyclicBarrier有什么区别?

CountDownLatch用于一个或多个线程等待其他线程完成操作,而CyclicBarrier用于多个线程相互等待,直到所有线程都到达一个共同点后再继续执行。

5. CountDownLatch如何使用?

CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
    new Thread(() -> {
        System.out.println(Thread.currentThread().getName() + " 正在执行任务");
        try {
            Thread.sleep(1000); // 模拟任务执行时间
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " 任务执行完毕");
        latch.countDown(); // 任务完成后计数减1
    }).start();
}
try {
    latch.await(); // 等待所有任务完成
    System.out.println("所有任务完成");
} catch (InterruptedException e) {
    e.printStackTrace();
}

6. CountDownLatch的计数器可以重置吗?

不可以,CountDownLatch的计数器只能递减,不能重置。

7. CountDownLatch可以多次调用countDown()吗?

可以,一个线程可以多次调用countDown(),只要计数器的值大于0。

8. CountDownLatch的await()方法可以带超时参数吗?

可以,await()方法可以带有两个参数的重载版本,允许设置超时时间。

9. CountDownLatch的await()方法在什么情况下会返回?

当计数器的值到达0时,await()方法会返回。如果设置了超时时间,并且在超时时间内计数器未到达0,也会返回。

10. CountDownLatch适用于哪些场景?

适用于需要等待多个线程执行完毕再继续执行的场景,例如初始化操作、资源准备等。

11. CountDownLatch和join()方法有什么区别?

CountDownLatch允许多个线程等待一组线程完成操作,而join()方法只能等待单个线程完成。

12. CountDownLatch在实际项目中的应用有哪些?

可以用于控制线程的启动顺序,或者在测试中模拟并发操作。

13. CountDownLatch的getCount()方法有什么作用?

getCount()方法返回当前计数器的值,可以用于检查还有多少个操作未完成。

14. CountDownLatch的await()方法会抛出异常吗?

是的,await()方法会抛出InterruptedException异常,如果当前线程在等待过程中被中断。

15. CountDownLatch如何与ExecutorService一起使用?

可以将CountDownLatch作为构造函数参数传递给线程任务,然后在所有任务执行完毕后调用await()方法等待所有任务完成。

16. CountDownLatch的计数器初始值设置有什么要求?

计数器的初始值应该等于需要等待的操作数量,不能小于实际需要等待的数量。

17. CountDownLatch在多线程测试中的应用是什么?

在多线程测试中,CountDownLatch可以用来同步测试线程的执行,确保测试的顺序性。

18. CountDownLatch如何确保所有线程都执行完毕?

通过调用countDown()方法递减计数器,当计数器到达0时,所有调用await()方法的线程会被唤醒。

19. CountDownLatch是否可以在同一个线程中多次使用?

不可以,CountDownLatch一旦计数器到达0,就不能再被重用。

20. CountDownLatch的await()方法是否可以被中断?

是的,如果当前线程在await()方法等待过程中被中断,会抛出InterruptedException异常。