首页 > 解决方案 > FutureTask 获取与运行,任务永远不会完成

问题描述

我正在学习 Callables 并决定制作一个非常简单的程序。问题是当我调用 getFutureTask(); 时线程被阻塞了。Thread.State:TIMED_WAITING(在对象监视器上)

你能告诉我为什么会这样吗?为什么当我在 futureTask.get() 之前编写 futureTask.run() 时我的程序可以工作;我明白 get() 方法等待并返回结果。但无法理解 run() 方法的作用。我非常感谢您的回答!

   public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
       FutureTask futureTask = getFutureTask(1);
        System.out.println(futureTask.get());

    }


  public static FutureTask<Integer> getFutureTask(Integer i) {
        return new FutureTask<Integer>(() -> i*45);

    }

标签: javacallablefuturetask

解决方案


从 API FutureTask

get() - 如有必要,等待计算完成,然后检索其结果。

run() - 将此 Future 设置为其计算结果,除非它已被取消。

因此,run()它将实际运行您的 FutureTask 并最终得出计算结果。get()另一方面,如果计算完成,则会为您提供结果。它不会开始计算,也不会调用run()自己。

另见@Zabuzard 的评论:

run 是实际开始执行任务的方法。它应该在不同的线程中调用,例如由 ExecutorService。get 不会触发执行,它只是等到任务完成,这发生在 run() 结束时。FutureTask 不应该由用户直接使用。相反,您应该研究 ExecutorService 和 CompletableFuture 以获得一个很好的接口来生成异步任务。


推荐阅读