java - 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);
}
解决方案
从 API FutureTask
:
get() - 如有必要,等待计算完成,然后检索其结果。
run() - 将此 Future 设置为其计算结果,除非它已被取消。
因此,run()
它将实际运行您的 FutureTask 并最终得出计算结果。get()
另一方面,如果计算完成,则会为您提供结果。但它不会开始计算,也不会调用run()
自己。
另见@Zabuzard 的评论:
run 是实际开始执行任务的方法。它应该在不同的线程中调用,例如由 ExecutorService。get 不会触发执行,它只是等到任务完成,这发生在 run() 结束时。FutureTask 不应该由用户直接使用。相反,您应该研究 ExecutorService 和 CompletableFuture 以获得一个很好的接口来生成异步任务。
推荐阅读
- javascript - 如何在没有特定键的情况下从 JSON 对象中获取值
- sql - 两天的价值
- android - AsyncTasks 中的同步方法
- javascript - 遍历 Handlebars 中的对象
- jquery - 如何将自定义 CSS 模态转换为 Bootstrap 模态?
- r - 如何使用 for 循环从表中提取行并执行计算
- c++ - QStandardItem 重新定义错误
- javascript - 如何将levelDB读取流转换为同步方法
- c# - .Net-Framework 中与 Groupby 的不一致
- perl - IO::Socket::INET->new 在错误时返回 undefined 吗?