编程语言
首页 > 编程语言> > java-在没有多线程的情况下使用Future有什么意义?

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

作者:互联网

我继承了一些代码,并且没有任何原始开发人员.该代码大量使用了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();
}

当然,代码要复杂得多,并在出现错误的情况下返回exceptionCompletedFuture,但是这里有Callable,没有Runnable,没有执行程序,没有supplyAsync()没有多线程的迹象.我想念什么?在单线程上下文中使用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
}

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

现在,想象一下,如果应用程序的最高级别如上所示,并且在某个时候某个非常低级别的请求不得不从文件中读取内容,将会发生什么.读取该文件将产生未来.如果介于两者之间的所有中间层都无法处理期货,那么您将不得不进行套期交易,这将使目标失控.这就是为什么我说期货往往是全有或全无.

所以我的猜测是:

>您的朋友当前正在执行异步操作,而您尚未捕获它(他曾经从文件或数据库中读取过任何东西吗?如果是,则他阻止了吗?).
>他打算某天做异步的事情,并想为此做计划.
>他在其他异步框架上花费了很多时间,即使他没有正确使用它,也逐渐喜欢这种样式.

标签:completable-future,multithreading,asynchronous,future,java
来源: https://codeday.me/bug/20191110/2014189.html