问题背景
假设我们有一个场景,有5个线程并行执行任务,同时我们希望主线程能够等待这5个子线程全部完成后再继续执行。这种情况下,我们可以使用CountDownLatch
来实现线程同步。
CountDownLatch简介
CountDownLatch
是Java并发包(java.util.concurrent)中提供的一个同步工具类,用于控制多个线程之间的同步。它的原理很简单:在构造CountDownLatch
对象时,我们指定一个计数器的初始值,然后每个线程在完成自己的任务后会调用countDown()
方法将计数器减1,当计数器变为0时,表示所有线程都已经完成任务,此时主线程就会被释放。
代码示例
下面是一个使用CountDownLatch
实现线程同步的示例代码:
import java.util.concurrent.CountDownLatch;
public class ThreadSyncExample {
public static void main(String[] args) throws InterruptedException {
int threadCount = 5;
CountDownLatch latch = new CountDownLatch(threadCount);
for (int i = 0; i < threadCount; i++) {
Thread thread = new WorkerThread(latch);
thread.start();
}
// 主线程等待所有子线程完成任务
latch.await();
System.out.println("All threads have completed their tasks. Main thread can continue.");
}
}
class WorkerThread extends Thread {
private final CountDownLatch latch;
public WorkerThread(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
try {
// 模拟任务执行
Thread.sleep((long) (Math.random() * 1000));
System.out.println("Task completed by " + Thread.currentThread().getName());
// 完成任务后调用countDown()
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们首先创建了一个CountDownLatch
对象,并将其初始值设置为5。然后,在主线程中创建了5个WorkerThread
线程,并启动它们。每个WorkerThread
线程执行完自己的任务后会调用countDown()
方法将计数器减1。
最后,主线程调用latch.await()
方法,会阻塞直到计数器变为0,即所有子线程都已经完成任务。一旦计数器为0,主线程就会继续执行并输出相应的提示信息。
总结
使用CountDownLatch
能够很方便地实现多个线程之间的同步。通过合理地控制计数器的初始值和调用countDown()
方法的时机,我们可以实现复杂的线程同步逻辑。在实际开发中,合理使用CountDownLatch
可以提高代码的可读性和可维护性,同时也能够避免一些并发问题的出现。
希望本文对你理解并发编程和使用CountDownLatch
有所帮助!