gpt4 book ai didi

java - 在没有多线程的情况下使用 Future 有什么意义?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:45 26 4
gpt4 key购买 nike

我继承了一些代码,原来的开发人员已经不在了。该代码大量使用了 CompletableFuture,这是我第一次使用它,所以我仍在努力思考它。据我了解,(Completable)Future 通常与一些多线程机制一起使用,该机制允许我们在执行耗时任务时做一些其他事情,然后通过 Future 简单地获取其结果.如 the javadoc :

interface ArchiveSearcher { String search(String target); }
class App {
ExecutorService executor = ...
ArchiveSearcher searcher = ...
void showSearch(final String target) throws InterruptedException {
Future<String> future = executor.submit(new Callable<String>() {
public String call() {
return searcher.search(target);
}});
displayOtherThings(); // do other things while searching
try {
displayText(future.get()); // use future
} catch (ExecutionException ex) { cleanup(); return; }
}
}

但是,在我继承的这个应用程序中,以下不使用任何多线程的模式多次出现:

public Object serve(Object input) throws ExecutionException, InterruptedException {
CompletableFuture<Object> result = delegate1(input);
return result.get();
}

private CompletableFuture<Object> delegate1(Object input) {
// Do things
return delegate2(input);
}

private CompletableFuture<Object> delegate2(Object input) {
return CompletableFuture.completedFuture(new Object());
}

对我来说,这等同于:

public Object serve(Object input) {
Object result = delegate1(input);
return result;
}

private Object delegate1(Object input) {
// Do things
return delegate2(input);
}

private Object delegate2(Object input) {
return new Object();
}

当然代码要复杂得多,出错时返回exceptionallyCompletedFuture,但是有Callable,没有Runnable,没有 Executor,没有 supplyAsync() 没有多线程的迹象。我错过了什么?在单线程上下文中使用 Future 有什么意义?

最佳答案

Futures 对于存在异步编程的情况至关重要。异步编程的最大优点之一是它允许您使用单线程编写非常高效的代码。

此外, future 往往是一个孤注一掷的命题。如果您想编写异步代码,则必须从上到下编写,即使并非每个方法都执行异步操作。

例如,假设您想编写一个单线程 HTTP 服务器,如 twistedexpress .服务器的顶层(这里是非常自由的伪代码)可能类似于:

while (true) {
if (serverSocket.ready()) {
connection = serverSocket.accept();
futures.add(server.serve(connection));
}
for (Future future : futures) {
if (future.isDone()) {
Object result = future.get();
sendResult(result);
}
}
//Some kind of select-style wait here
}

只有一个线程,但任何时候发生通常需要等待的操作(从数据库读取、文件读取、读取请求等),它都会使用 futures 并且不会阻塞一个线程,因此您有一个高性能单线程 HTTP 服务器。

现在,想象一下,如果您的应用程序的最高级别与上面类似,并且在某个时候某个非常低级别的请求必须从文件中读取某些内容,会发生什么情况。读取的文件会产生一个 future 。如果你中间的所有中间层都不处理 future ,那么你将不得不阻止,这会破坏目的。这就是为什么我说 future 往往是全有或全无的原因。

所以我的猜测是:

  1. 你的 friend 目前正在做一些异步的事情,而你还没有发现(他有没有从文件或数据库或任何东西中读取过?如果有,他是否阻塞了?)。
  2. 他计划有一天做一些异步的事情,并想为此做好计划。
  3. 他在其他异步框架上花了很多时间,并且逐渐喜欢上了这种风格,即使他没有正确使用它。

关于java - 在没有多线程的情况下使用 Future 有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47876209/

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