Java Futuretask示例
时间:2020-02-23 14:35:01 来源:igfitidea点击:
在本教程中,我们将看到Java Futuretask示例。
已在JDK 5中引入了Futuretask程序,其中包含了执行者框架。 FutureTaskClass是未来对象的具体实现,并提供了开始和取消任务的方法。
它还提供了查看计算是否完成的方法。
我们可以查询Futuretask对象并获得计算结果。
如果我们在Futuretask对象上调用get方法,则会阻止调用并返回一旦计算完成。
让我们更了解这个例子。
Java Futuretask示例:
让我们创建一个非常简单的例子。
第1步:创建一个名为的可调用任务 MultiplyingTask.java。
package org.igi.theitroad;
import java.util.concurrent.Callable;
public class MultiplyingTask implements Callable{
int a;
int b;
long sleepTime;
public MultiplyingTask(int a, int b, long sleepTime) {
this.a=a;
this.b=b;
this.sleepTime=sleepTime;
}
@Override
public Integer call() throws Exception {
Thread.sleep(sleepTime);
return a*b;
}
}
第2步:创建一个名为的类 FutureTaskMain。
这将是我们的主班。
package org.igi.theitroad;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class FutureTaskMain {
public static void main(String[] args) {
MultiplyingTask multiplyingTask1= new MultiplyingTask(10,20,2000l);
MultiplyingTask multiplyingTask2= new MultiplyingTask(20,40,4000l);
FutureTask<Integer> futureTask1=new FutureTask<>(multiplyingTask1);
FutureTask<Integer> futureTask2=new FutureTask<>(multiplyingTask2);
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.execute(futureTask1);
executor.execute(futureTask2);
while(true)
{
try {
if(!futureTask1.isDone())
{
System.out.println("FutureTask1 output="+futureTask1.get());
}
if(!futureTask2.isDone())
{
System.out.println("Waitng for futureTask2 for completion");
System.out.println("FutureTask2 output="+futureTask2.get());
}
if(futureTask1.isDone() && futureTask2.isDone())
{
System.out.println("Completed both the FutureTasks, shutting down the executors");
executor.shutdown();
return;
}
}
catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}
让我们运行上面的程序来检查输出:
FutureTask1 output=200 Waitng for futureTask2 for completion FutureTask2 output=800 Completed both the future task, shutting down the executors
解释:
- 创建两个名为multiplyingtask1和multiplyingTask2的可调用任务。请注意,我们为2000年的休眠时间为2000,对于多元次数为ClyplyingTask1和4000,因此CompliultingTask2将需要更多的时间而不是Multiply Task1.
- 通过分别传递MultiplyingTask1和MultiplyingTask2,创建了两个名为Futuretask1和Futuretask2的Futuretask对象。
- 搭配无限循环条件(真实)
- !futuretask1.isdone()检查完成Futuretask1,如果没有完成,我们已致电futuretask1.get(),因为get方法是阻塞操作,当前线程将等待Futuretask1完成。
- 一旦完成了Futuretask1,我们会检查!Futuretask2重复上述步骤。
- 一旦任务,例如:futuretask1和futuretask2都完成,我们会在执行者上调用shutdown()方法并从中返回。

