java什么情况下该用多线程_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 future = executor.submit(new Callable() {

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 result = delegate1(input);

return result.get();

}

private CompletableFuture delegate1(Object input) {

// Do things

return delegate2(input);

}

private CompletableFuture 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值