第六章 Java FutureTask 示例


在本教程中,我们将看到有关 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 示例的全部内容。


原文链接:https://codingdict.com/