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服务器,例如twisted或express.服务器的顶层(此处为非常宽松的伪代码)可能类似于:
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