你可以使用ExecutorServiceinvokeAll()方法来实现等待所有线程执行完毕再继续执行后续方法。

首先,你需要创建一个ExecutorService对象,并使用Executors.newFixedThreadPool()方法来创建一个固定线程数的线程池。例如,下面的代码创建了一个具有10个线程的线程池:

ExecutorService executor = Executors.newFixedThreadPool(10);

然后,你可以使用submit()方法将任务提交给线程池执行。例如,下面的代码提交了10个任务给线程池:

List<Future<?>> futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    Future<?> future = executor.submit(() -> {
        // 在这里写你的任务逻辑
    });
    futures.add(future);
}

接下来,你可以使用invokeAll()方法等待所有任务执行完毕。invokeAll()方法接收一个Collection类型的任务列表,并返回一个List<Future<T>>类型的结果,其中T是你任务的返回类型。你可以将futures列表传递给invokeAll()方法,然后使用get()方法获取任务的执行结果。例如:

try {
    List<Future<?>> results = executor.invokeAll(futures);
    for (Future<?> result : results) {
        result.get(); // 等待任务执行完毕,并获取执行结果
    }
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

最后,记得在所有任务执行完毕后关闭线程池,释放资源:

executor.shutdown();

完整的代码示例:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(10);
        List<Future<?>> futures = new ArrayList<>();
        
        for (int i = 0; i < 10; i++) {
            Future<?> future = executor.submit(() -> {
                // 在这里写你的任务逻辑
            });
            futures.add(future);
        }
        
        try {
            List<Future<?>> results = executor.invokeAll(futures);
            for (Future<?> result : results) {
                result.get(); // 等待任务执行完毕,并获取执行结果
            }
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        
        executor.shutdown();
    }
}

这样,在所有线程执行完毕后,你可以继续执行后续的方法


原文地址: http://www.cveoy.top/t/topic/iJJC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录