java 同时运行5个任务_Java并发编程高级篇(五):运行多个任务并处理所有结果

执行器框架给我们提供了一个方法,让我们可以发送给执行器一个任务列表,并等待任务列表中的所有任务执行完毕。然后它将返回一个与任务列表对应的Future列表。

下面我们来看一下这个invokeAll方法怎么用。

首先我们创建一个Result类,用于保存任务执行结果。

/**

* 创建Result类,作为Callable接口实现call()方法的返回值类型

*

* Created by hadoop on 2016/11/2.

*/

public class Result {

private String name;

private int value;

public Result(String name, int value) {

this.name = name;

this.value = value;

}

public String getName() {

return name;

}

public int getValue() {

return value;

}

}

接下来我们实现Callable接口,然后实现任务逻辑。随机等待一段时间来模拟任务的执行过程,然后求得一个随机数,并返回Result。

import java.util.concurrent.Callable;

import java.util.concurrent.TimeUnit;

/**

* Created by hadoop on 2016/11/2.

*/

public class Task implements Callable {

private String name;

public Task(String name) {

this.name = name;

}

@Override

public Result call() throws Exception {

long duration = (long) (Math.random() * 10);

System.out.printf("%s: Starting and Waiting %d seconds for results.\n", this.name, duration);

TimeUnit.SECONDS.sleep(duration);

int value = 0;

for (int i = 0; i < 5; i++) {

value += (int) (Math.random() * 100);

}

return new Result(this.name, value);

}

}

最后看一下主方法类,我们创建三个任务实例,并加入到任务列表中。然后调用invokeAll方法来执行这个任务列表,并接受一个Future列表返回值,并打印返回值结果。

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.*;

/**

* 运行多个任务并处理全部结果

*

* 该范例的关键点在于调用了ExecutorService的invokeAll()方法。

* 这个方法接收一个实现了Callable接口的任务列表,然后等待所有任务完成,并返回一个Future列表。

*

* Created by hadoop on 2016/11/2.

*/

public class Main {

public static void main(String[] args) {

ExecutorService executor = Executors.newCachedThreadPool();

List tasks = new ArrayList();

for (int i = 0; i < 3; i++) {

tasks.add(new Task(String.valueOf(i)));

}

try {

List> futures = executor.invokeAll(tasks);

//List> futures = executor.invokeAll(tasks, 2, TimeUnit.SECONDS);

executor.shutdown();

System.out.printf("Main: Start print resutls\n");

for (Future future : futures) {

System.out.printf("%s : %s\n", future.get().getName(), future.get().getValue());

//System.out.println(future.isCancelled());

}

} catch (Exception e) {

e.printStackTrace();

}

System.out.printf("Main: End of programe.\n");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值