并发编程:执行器:4、运行N个任务并处理全部返回结果(invokeAll() )

目录

threadPoolExecutor.invokeAll

案例功能

一、主程序

二、结果对象(Model)

三、任务

四、执行结果


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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值