在本教程中,我们将看到有关 Java FutureTask 的示例。 FutureTask 类已在 JDK 5 中与 Executor Framework 一起引入。FutureTask 类是Future对象的具体实现,提供了启动和取消任务的方法,也提供了查看计算是否完成的方法。我们可以查询 FutureTask 对象并获取计算结果。 如果我们在 FutureTask 对象上调用 get 方法,它是阻塞调用,一旦计算完成就返回。 让我们通过这个例子来了解更多。
Java FutureTask 示例:
我们创建一个非常简单的示例。
步骤 1:创建一个名为MultiplyingTask.java .
package org.arpit.java2blog;
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.arpit.java2blog;
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 的可调用任务。请注意,我们为 multiplyingTask1 提供了睡眠时间为 2000,而为 multiplyingTask2 提供了 4000 的睡眠时间,因此 multiplyingTask2 将比 multiplyingTask1 花费更多的时间。
-
通过分别传递 multiplyingTask1 和 multiplyingTask2 创建了两个名为 futureTask1 和 futureTask2 的 FutureTask 对象。
-
使用 while(true) 设置无限循环条件
-
!futureTask1.isDone() 检查futureTask1 是否完成,如果还没有完成,我们调用futureTask1.get(),因为get 方法是阻塞操作,当前线程将等待futureTask1 完成。
-
一旦 futureTask1 完成,我们检查 !futureTask2.isDone() 并为 futureTask2 重复上述步骤。
-
一旦任务(即futureTask1 和futureTask2)都完成,我们在执行程序上调用shutdown() 方法并从中返回。
这就是 Java FutureTask 示例的全部内容。
|