java for循环 使用线程池多线程执行任务 并且等待完全返回
在Java中,可以使用线程池来实现多线程执行任务,并等待所有任务执行完毕返回结果。下面是一个示例代码:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class ThreadPoolExample {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 创建任务列表
List<Callable<Integer>> tasks = new ArrayList<>();
tasks.add(new MyTask(1));
tasks.add(new MyTask(2));
tasks.add(new MyTask(3));
tasks.add(new MyTask(4));
tasks.add(new MyTask(5));
// 执行任务并获取Future列表
List<Future<Integer>> futures = executorService.invokeAll(tasks);
// 等待所有任务执行完毕并获取结果
int sum = 0;
for (Future<Integer> future : futures) {
sum += future.get();
}
// 关闭线程池
executorService.shutdown();
System.out.println("Sum: " + sum);
}
static class MyTask implements Callable<Integer> {
private int number;
public MyTask(int number) {
this.number = number;
}
@Override
public Integer call() throws Exception {
// 模拟耗时操作
Thread.sleep(1000);
return number * number;
}
}
}
在上述示例中,首先创建了一个固定大小为5的线程池。然后创建了一个任务列表,每个任务都是一个实现了Callable<Integer>接口的类。接着使用executorService.invokeAll(tasks)方法执行任务,并获取一个Future列表。最后,使用future.get()方法获取每个任务的结果,并累加到sum变量中。最后,关闭线程池并输出sum的值。
注意,invokeAll方法会阻塞直到所有任务执行完毕,因此可以确保在获取结果时所有任务都已经完成。
原文地址: https://www.cveoy.top/t/topic/ieC1 著作权归作者所有。请勿转载和采集!