当前位置: 首页 > 面试题库 >

听觉未来与完成未来

贺卜霸
2023-03-14
问题内容

我尽力而为,但没有找到任何文章和博客可以清楚地比较ListenableFutureCompletableFuture,并且提供了很好的分析。

因此,如果任何人都可以向我解释或指向这样的博客或文章,那对我来说真的非常好。


问题答案:

无论 ListenableFutureCompletableFuture 有超过它的父类的优势 未来
通过允许呼叫者在这样或那样的回调“注册”当异步动作已经完成被调用。

使用 Future, 您可以执行以下操作:

ExecutorService executor = ...;
Future f = executor.submit(...);
f.get();

f.get() 被阻塞,直到异步操作完成。

使用 ListenableFuture, 您可以像这样注册回调:

ListenableFuture listenable = service.submit(...);
    Futures.addCallback(listenable, new FutureCallback<Object>() {
                @Override
                public void onSuccess(Object o) {
                    //handle on success
                }

                @Override
                public void onFailure(Throwable throwable) {
                   //handle on failure
                }
            })

使用 CompletableFuture, 您还可以为任务完成时注册一个回调,但是它与 ListenableFuture
不同,因为它可以从任何希望完成任务的线程中完成。

CompletableFuture completableFuture = new CompletableFuture();
    completableFuture.whenComplete(new BiConsumer() {
        @Override
        public void accept(Object o, Object o2) {
            //handle complete
        }
    }); // complete the task
    completableFuture.complete(new Object())

线程调用完成任务时,如果任务尚未完成,则通过调用get()接收的值将设置为参数值。

了解有关CompletableFuture的信息



 类似资料:
  • 我是新的完全未来。我试图为元素列表(即参数)调用并行方法,然后将结果组合起来创建最终响应。我还试图设置50毫秒的超时,以便如果调用不返回50毫秒,我将返回默认值。 到目前为止,我已经尝试过: 但我一直得到错误说: 有人能告诉我我在这里做错了什么吗?如果我走错了方向,请纠正我。 谢谢

  • 如果一个字段在可完成的未来代码中为空,我必须发送一个异常: 这个想法是,如果孩子的字段为空(在本例中为lastName),我必须抛出一个自定义异常,我不太确定如何实现这一点。 我的想法是使用thenAccept方法发送异常,如下所示: 我必须评估数据库中的lastName是否为空,我必须抛出一个异常。 有什么想法吗?

  • 刚刚开始探索reactor项目及其抽象、Mono和Flux,并希望了解与Java8 barebones CompletableFuture的基本区别。 下面是我的一个简单代码: 首先,并不奇怪。通过ForkJoinPool调度函数的执行,“end”行立即打印,程序终止,因为主线程在这里确实很短--正如预期的那样。 但是将主线程阻塞在那里。此外,在函数中打印的线程名是主线程。因此,我看到的是顺序/阻

  • 我正在围绕java库编写一个小的scala包装器。 Java库有一个对象QueryExecutor,它公开了2种方法: 执行(查询):结果 asyncExecute(查询):ListenableFuture[结果] 本文中的ListenableFuture是来自guava图书馆的。 我希望我的scala包装器返回一个Future[Result]而不是java对象,但我不确定实现它的最佳方法是什么。

  • 我想要一个完整的未来,只发出完成的信号(例如,我没有返回值)。 我可以将CompletableFuture实例化为: 但是我应该向完整的方法提供什么呢?例如,我不能做

  • 我要做的是异步计算树结构的深度,我将有树的第一层,我想启动一个异步线程来分别计算每个节点的深度。 在计算过程中,树中显然可能有一个分叉,在这一点上,我想踢一个额外的线程来计算那个分支。 我已经得到了这个工作,但我需要做一些整理逻辑,当所有这些未来完成。但我对这一过程中产生的额外的可完成的未来感到困扰。 我会用什么方法来保存所有开始的CompletableFutures+那些动态创建的,并且在执行任