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异常。