【发布时间】:2020-05-10 13:25:06
【问题描述】:
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<Integer> calculate(Integer input) {
return executor.submit(() -> {
Thread.sleep(3000);
return input * input;
});
}
public static void main(String []args) throws Exception {
Main m = new Main();
System.out.println(m.calculate(5).get());
System.out.println("Main");
我们使用 2 个线程向 Executor 提交 Callable,但是当我告诉 m.calculate(5).get() 时它阻塞了主线程。
所以,我不明白,如果 Future 阻塞了主线程并且不异步运行,我应该何时以及为什么要使用它?
【问题讨论】:
-
问题不在于
Future本身。get方法等待它完成并返回未来的返回值,所以通过调用get你明确阻塞了主线程。 -
@BackSlash,表示
Future不是为异步任务创建的,没有阻塞? -
您似乎忽略了这样一个事实,即阻塞的是对
get()的调用。在调用get()之前,您可以做任何您想做的事情,Future所代表的任务将与您正在做的任何其他事情同时运行。 -
@Rarity7- 如果你调用
get,它只是非并行的。如果结果还没有准备好,你还期望get做什么?您可以使用isDone()检查结果是否已准备就绪
标签: java multithreading future