countdownlatch 配合线程池 使用详解
时间: 2023-09-01 09:11:25 浏览: 205
CountDownLatch 是一个非常实用的多线程工具类,它可以让一个或多个线程等待其他线程完成执行后再继续执行。在多线程编程中,我们经常需要等待某些任务完成后才能进行下一步操作,这时就可以使用 CountDownLatch 来实现。
配合线程池使用 CountDownLatch 的基本思路如下:
1. 创建一个 CountDownLatch 对象,并设置计数器初始值为需要等待的线程数。
2. 创建一个线程池,然后提交需要等待执行的任务。
3. 在任务中调用 CountDownLatch 的 countDown() 方法来减少计数器的值。
4. 在主线程中调用 CountDownLatch 的 await() 方法来等待所有任务执行完毕。
下面是一个简单的示例代码:
```java
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
int threadCount = 5;
CountDownLatch latch = new CountDownLatch(threadCount);
ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
for (int i = 0; i < threadCount; i++) {
executorService.submit(new Worker(latch));
}
latch.await();
System.out.println("All tasks are finished");
executorService.shutdown();
}
static class Worker implements Runnable {
private final CountDownLatch latch;
public Worker(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
try {
// 模拟执行任务
Thread.sleep((long) (Math.random() * 10000));
System.out.println(Thread.currentThread().getName() + " has finished the task");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown();
}
}
}
}
```
在上面的示例代码中,我们创建了一个 CountDownLatch 对象,计数器的初始值为 5。然后创建了一个线程池,提交了 5 个任务,并在任务中模拟了一定的执行时间。每个任务执行完毕后都会调用 CountDownLatch 的 countDown() 方法来减少计数器的值。最后,在主线程中调用 CountDownLatch 的 await() 方法来等待所有任务执行完毕。当所有任务都完成后,输出 "All tasks are finished"。
需要注意的是,在使用 CountDownLatch 时,计数器的初始值要与需要等待的线程数相等,否则可能会出现死锁的情况。另外,CountDownLatch 只能使用一次,计数器的值减少到 0 后就无法重置。如果需要重复使用,可以考虑使用 CyclicBarrier 或 Semaphore。
阅读全文