Java多线程 await方法实现
流程图
flowchart TD
A[创建线程池] --> B[创建CountDownLatch对象]
B --> C[创建并启动多个线程]
C --> D[线程执行任务]
D --> E[任务完成后调用CountDownLatch的countDown方法]
E --> F[主线程调用await方法等待所有任务完成]
详细步骤
- 创建线程池:使用
Executors.newFixedThreadPool(int nThreads)
方法创建一个固定线程数的线程池。可以根据具体需求设置线程池的大小。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
ExecutorService executorService = Executors.newFixedThreadPool(5);
- 创建CountDownLatch对象:使用
CountDownLatch
类创建一个用于等待多个线程完成的计数器。参数指定计数器的初始值,一般设置为线程的个数。
import java.util.concurrent.CountDownLatch;
CountDownLatch countDownLatch = new CountDownLatch(5);
- 创建并启动多个线程:使用
executorService.execute(Runnable command)
方法创建并启动多个线程。Runnable
是一个接口,可以通过实现它来定义线程的任务。
for (int i = 0; i < 5; i++) {
executorService.execute(new MyTask(countDownLatch));
}
- 线程执行任务:定义一个
Runnable
的实现类,重写run()
方法,在run()
方法中实现具体的任务逻辑。在任务执行完毕后,调用countDownLatch.countDown()
方法来减少计数器的值。
class MyTask implements Runnable {
private CountDownLatch countDownLatch;
public MyTask(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
// 执行任务逻辑
// ...
countDownLatch.countDown();
}
}
- 任务完成后调用CountDownLatch的
countDown()
方法:在每个线程的任务执行完毕后,调用countDownLatch.countDown()
方法来减少计数器的值。当计数器的值变为0时,所有任务都已完成。
countDownLatch.countDown();
- 主线程调用
await()
方法等待所有任务完成:在主线程中,调用countDownLatch.await()
方法等待所有任务的完成。该方法会阻塞主线程,直到计数器的值变为0。
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
完整代码示例
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 创建CountDownLatch对象
CountDownLatch countDownLatch = new CountDownLatch(5);
// 创建并启动多个线程
for (int i = 0; i < 5; i++) {
executorService.execute(new MyTask(countDownLatch));
}
// 任务完成后调用CountDownLatch的countDown方法
// 在每个线程的任务执行完毕后,调用countDownLatch.countDown()方法来减少计数器的值
// 当计数器的值变为0时,所有任务都已完成
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 主线程继续执行其他逻辑
System.out.println("所有任务已完成");
// 关闭线程池
executorService.shutdown();
}
}
class MyTask implements Runnable {
private CountDownLatch countDownLatch;
public MyTask(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
// 执行任务逻辑
// ...
countDownLatch.countDown();
}
}
以上就是实现Java多线程await方法的完整流程和代码示例。通过使用CountDownLatch和线程池,我们可以方便地实现对多个线程任务的等待与控制。希望对你有所帮助!