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()方法并从中返回。