目录
threadPoolExecutor.invokeAll
提交一个任务列表到执行器中,并等待列表内的全部任务执行完毕。
案例功能
模拟10个任务,使用invokeAll方法来执行这10个任务的列表,最终把结果进行输出。
一、主程序
package xyz.jangle.thread.test.n4_5.invokeall;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 4.5 invokeAll() 运行N个任务并处理全部返回结果
*
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年8月20日 下午5:02:19
*
*/
public class M {
public static void main(String[] args) {
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
ArrayList<Task> list = new ArrayList<Task>();
// 模拟10个任务
for (int i = 0; i < 10; i++) {
Task task = new Task("Task-" + i);
list.add(task);
}
List<Future<Result>> resultList = null;
try {
// invokeAll方法会被阻塞,直到所有任务完成。
resultList = cachedThreadPool.invokeAll(list);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main:shutdown");
cachedThreadPool.shutdown();
System.out.println("Main:打印结果");
for (Future<Result> future : resultList) {
try {
Result result = future.get();
System.out.println(result.getName() + ":" + result.getValue());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
}
二、结果对象(Model)
package xyz.jangle.thread.test.n4_5.invokeall;
/**
* 用于存放结果(model)
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年8月20日 下午7:58:57
*
*/
public class Result {
private String name;
private int value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
三、任务
package xyz.jangle.thread.test.n4_5.invokeall;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
/**
* 任务(实现Callable接口的任务)
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年8月20日 下午8:00:45
*
*/
public class Task implements Callable<Result> {
private final String name;
public Task(String name) {
super();
this.name = name;
}
@Override
public Result call() throws Exception {
System.out.println(this.name + "开始...");
try {
long duration = (long) (Math.random() * 10);
System.out.println(this.name + ":等待" + duration + "秒,以获取结果");
TimeUnit.SECONDS.sleep(duration);
} catch (InterruptedException e) {
e.printStackTrace();
}
int value = 0;
for (int i = 0; i < 5; i++) {
value += (Math.random() * 100);
}
Result result = new Result();
result.setName(name);
result.setValue(value);
System.out.println(this.name + "结束...");
return result;
}
}
四、执行结果
Task-2开始...
Task-0开始...
Task-5开始...
Task-7开始...
Task-9开始...
Task-4开始...
Task-3开始...
Task-1开始...
Task-8开始...
Task-6开始...
Task-2:等待9秒,以获取结果
Task-5:等待4秒,以获取结果
Task-9:等待5秒,以获取结果
Task-7:等待0秒,以获取结果
Task-6:等待2秒,以获取结果
Task-3:等待5秒,以获取结果
Task-1:等待5秒,以获取结果
Task-0:等待2秒,以获取结果
Task-4:等待6秒,以获取结果
Task-8:等待3秒,以获取结果
Task-7结束...
Task-6结束...
Task-0结束...
Task-8结束...
Task-5结束...
Task-9结束...
Task-1结束...
Task-3结束...
Task-4结束...
Task-2结束...
Main:shutdown
Main:打印结果
Task-0:268
Task-1:203
Task-2:304
Task-3:278
Task-4:277
Task-5:246
Task-6:313
Task-7:265
Task-8:233
Task-9:310