gpt4 book ai didi

java - Future 是否需要在单独的线程中执行计算?

转载 作者:搜寻专家 更新时间:2023-10-31 19:53:52 25 4
gpt4 key购买 nike

来自documentation

Future represents the result of an asynchronous computation.

是否表示一个线程调用Future#get方法不应该是执行计算的线程吗?那么,线程调用 Future#get 是否合适?如果还没有开始计算?我不确定是否可以将其称为异步计算...

最佳答案

术语“异步计算”并不强制计算必须在不同的线程中运行。如果 API 设计者有此意图,他们会编写“在不同线程中运行的计算”。在这里,它只是意味着没有关于计算何时发生的规范。

同样,JRE 提供的现有实现不会强制在不同的线程中进行计算。 FutureTask 可能是最著名的实现,可以按如下方式使用:

Callable<String> action = new Callable<String>() {
public String call() {
return "hello "+Thread.currentThread();
}
};

FutureTask<String> ft=new FutureTask<>(action);
ft.run();
System.out.println(ft.get());

通常,FutureTask 的实例由 ExecutorService 创建,它将确定何时以及由哪个线程执行计算:

ExecutorService runInPlace=new AbstractExecutorService() {
public void execute(Runnable command) {
command.run();
}
public void shutdown() {}
public List<Runnable> shutdownNow() { return Collections.emptyList(); }
public boolean isShutdown() { return false; }
public boolean isTerminated() { return false; }
public boolean awaitTermination(long timeout, TimeUnit unit) { return false; }
};
Future<String> f=runInPlace.submit(action);
System.out.println(ft.get());

请注意,此execute() 实现不违反its contract :

Executes the given command at some time in the future. The command may execute in a new thread, in a pooled thread, or in the calling thread, at the discretion of the Executor implementation.

注意“或在调用线程中”……

另一个实现是ForkJoinTask:

ForkJoinTask<String> fjt=new RecursiveTask<String>() {
protected String compute() {
return "hello "+Thread.currentThread();
}
};
fjt.invoke();
System.out.println(fjt.get());

请注意,虽然此类任务旨在支持拆分为可由不同线程执行的子任务,但此处有意利用调用线程。如果任务无法拆分,则它完全在调用者的线程中运行,因为这是最有效的解决方案。


这些例子都在调用者线程中运行,但它们都不会执行 get() 方法中的任务。原则上,这不会违反约定,因为它会返回结果值,但在执行计算后,您在尝试实现 get(long timeout, TimeUnit unit) 时可能会遇到麻烦> 正确。相比之下,有一个不工作的 cancel() 仍然在契约(Contract)之内。

关于java - Future 是否需要在单独的线程中执行计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32881158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com