Java Futuretask示例
时间:2020-02-23 14:35:01 来源:igfitidea点击:
在本教程中,我们将看到Java Futuretask示例。
已在JDK 5中引入了Futuretask程序,其中包含了执行者框架。 FutureTask
Class是未来对象的具体实现,并提供了开始和取消任务的方法。
它还提供了查看计算是否完成的方法。
我们可以查询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()方法并从中返回。