Java多线程 await方法实现

流程图

flowchart TD
    A[创建线程池] --> B[创建CountDownLatch对象]
    B --> C[创建并启动多个线程]
    C --> D[线程执行任务]
    D --> E[任务完成后调用CountDownLatch的countDown方法]
    E --> F[主线程调用await方法等待所有任务完成]

详细步骤

  1. 创建线程池:使用Executors.newFixedThreadPool(int nThreads)方法创建一个固定线程数的线程池。可以根据具体需求设置线程池的大小。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

ExecutorService executorService = Executors.newFixedThreadPool(5);
  1. 创建CountDownLatch对象:使用CountDownLatch类创建一个用于等待多个线程完成的计数器。参数指定计数器的初始值,一般设置为线程的个数。
import java.util.concurrent.CountDownLatch;

CountDownLatch countDownLatch = new CountDownLatch(5);
  1. 创建并启动多个线程:使用executorService.execute(Runnable command)方法创建并启动多个线程。Runnable是一个接口,可以通过实现它来定义线程的任务。
for (int i = 0; i < 5; i++) {
    executorService.execute(new MyTask(countDownLatch));
}
  1. 线程执行任务:定义一个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();
    }
}
  1. 任务完成后调用CountDownLatch的countDown()方法:在每个线程的任务执行完毕后,调用countDownLatch.countDown()方法来减少计数器的值。当计数器的值变为0时,所有任务都已完成。
countDownLatch.countDown();
  1. 主线程调用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和线程池,我们可以方便地实现对多个线程任务的等待与控制。希望对你有所帮助!