天天看点

线程执行者(六)运行多个任务并处理所有结果

声明:本文是《 java 7 concurrency cookbook 》的第四章,作者: javier fernández gonzález 译者:许巧辉 校对:方腾飞,叶磊

运行多个任务并处理所有结果

执行者框架允许你在不用担心线程创建和执行的情况下,并发的执行任务。它还提供了future类,这个类可以用来控制任务的状态,也可以用来获得执行者执行任务的结果。

如果你想要等待一个任务完成,你可以使用以下两种方法:

如果任务执行完成,future接口的isdone()方法将返回true。

threadpoolexecutor类的awaittermination()方法使线程进入睡眠,直到每一个任务调用shutdown()方法之后完成执行。

这两种方法都有一些缺点。第一个方法,你只能控制一个任务的完成。第二个方法,你必须等待一个线程来关闭执行者,否则这个方法的调用立即返回。

threadpoolexecutor类提供一个方法,允许你提交任务列表给执行者,并且在这个列表上等待所有任务的完成。在这个指南中,你将学习如何使用这个特性,实现一个示例,执行3个任务,并且当它们完成时将结果打印出来。

准备工作…

这个指南的例子使用eclipse ide实现。如果你使用eclipse或其他ide,如netbeans,打开它并创建一个新的java项目。

如何做…

按以下步骤来实现的这个例子:

1.创建result类,存储这个示例中并发任务产生的结果。

<code>public class result {</code>

2.声明两个私有属性。一个string属性,名为name,另一个int属性,名为value。

<code>private string name;</code>

<code>private int value;</code>

3.实现相应的get()和set()方法,用来设置和获取name和value属性的值。

4.创建task类,实现callable接口,参数化为result类型。

<code>public class task implements callable&lt;result&gt; {</code>

5.声明一个私有string属性,名为name。

6.实现task类构造器,初始化这个属性。

7.实现这个类的call()方法,在本例中,它将返回一个result对象。

8.首先,写入一个信息到控制台,表明任务开始。

<code>system.out.printf("%s: staring\n",this.name);</code>

9.然后,等待一个随机时间。

10.在result对象中返回一个计算5个随机数的总和的int值。

11.创建result对象,用任务的名称和前面操作结果来初始化它。

12.写入一个信息到控制台,表明任务已经完成。

<code>system.out.println(this.name+": ends");</code>

13.返回result对象。

14.最后,实现这个示例的主类,创建main类,实现main()方法。

list tasklist=new arraylist&lt;&gt;();

for (int i=0; i&lt;3; i++){

task task=new task(i);

tasklist.add(task);

}

...try {

resultlist=executor.invokeall(tasklist);

} catch (interruptedexception e) {

e.printstacktrace();

}.使用shutdown()方法结束执行者。

executor.shutdown();

写入处理future对象列表任务的结果。

system.out.println("main: printing the results");

for (int i=0; ifuture future=resultlist.get(i);

try {

result result=future.get();

system.out.println(result.getname()+": "+result.

getvalue());

} catch (interruptedexception | executionexception e) {

继续阅读