使用 Future 的异步 API 永远不会完成
Async API using Future never completes
我尝试将 API 同步为:
Future<Integer> fASync(int x) {
return new FutureTask(() -> {
try {
Thread.sleep(new Random().nextInt(1, 3) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return x * x;
});
}
..然后我尝试使用它:
Future<Integer> asyncCall = fASync(x);
asyncCall .get();
但这永远不会完成,只会调用块。
这不是使 API 异步的正确方法吗?
您已经声明了一个 FutureTask
但实际上并没有 运行 它所以对 asyncCall.get()
的调用将永远阻塞。
这是您的示例,其中包含额外的日志记录并添加了一个步骤以在新的 ExecutorService
中执行任务。
static FutureTask<Integer> fASync(int x) {
System.out.println("fASync("+x+") called");
return new FutureTask<>(() -> {
System.out.println("fASync("+x+") FutureTask has started");
try {
Thread.sleep(new Random().nextInt(1, 3) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("fASync("+x+") FutureTask has ended");
return x * x;
});
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService exec = Executors.newFixedThreadPool(1);
FutureTask<Integer> task = fASync(5);
// MUST execute the task or task.get() will block forever
exec.execute(task);
System.out.println("task.get()="+task.get());
exec.shutdown();
exec.awaitTermination(1, TimeUnit.DAYS);
System.out.println("ENDED");
}
如果您启用 exec.execute(task);
行,它将打印这些消息并完成 task.get()
,而不是仅打印第一行并且没有来自 task.get()
:
的响应
fASync(5) called
fASync(5) FutureTask has started
fASync(5) FutureTask has ended
task.get()=25
ENDED
我尝试将 API 同步为:
Future<Integer> fASync(int x) {
return new FutureTask(() -> {
try {
Thread.sleep(new Random().nextInt(1, 3) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return x * x;
});
}
..然后我尝试使用它:
Future<Integer> asyncCall = fASync(x);
asyncCall .get();
但这永远不会完成,只会调用块。
这不是使 API 异步的正确方法吗?
您已经声明了一个 FutureTask
但实际上并没有 运行 它所以对 asyncCall.get()
的调用将永远阻塞。
这是您的示例,其中包含额外的日志记录并添加了一个步骤以在新的 ExecutorService
中执行任务。
static FutureTask<Integer> fASync(int x) {
System.out.println("fASync("+x+") called");
return new FutureTask<>(() -> {
System.out.println("fASync("+x+") FutureTask has started");
try {
Thread.sleep(new Random().nextInt(1, 3) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("fASync("+x+") FutureTask has ended");
return x * x;
});
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService exec = Executors.newFixedThreadPool(1);
FutureTask<Integer> task = fASync(5);
// MUST execute the task or task.get() will block forever
exec.execute(task);
System.out.println("task.get()="+task.get());
exec.shutdown();
exec.awaitTermination(1, TimeUnit.DAYS);
System.out.println("ENDED");
}
如果您启用 exec.execute(task);
行,它将打印这些消息并完成 task.get()
,而不是仅打印第一行并且没有来自 task.get()
:
fASync(5) called
fASync(5) FutureTask has started
fASync(5) FutureTask has ended
task.get()=25
ENDED