首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当尝试在java中使用CompletableFuture类时,输出没有返回,我把什么搞砸了?

当尝试在Java中使用CompletableFuture类时,输出没有返回,可能是以下几个原因导致的:

  1. 未正确设置CompletableFuture的回调函数:CompletableFuture类提供了一系列的回调函数,用于处理异步操作的结果。如果没有正确设置回调函数,就无法获取到操作的结果。可以通过使用thenApply()thenAccept()thenRun()等方法来设置回调函数,确保在操作完成后能够正确处理结果。
  2. 未正确处理异常:CompletableFuture类中的操作可能会抛出异常,如果没有正确处理异常,就无法获取到操作的结果。可以通过使用exceptionally()handle()等方法来处理异常,确保在操作发生异常时能够进行相应的处理。
  3. 未正确等待操作完成:CompletableFuture类中的操作是异步执行的,如果没有正确等待操作完成,就无法获取到操作的结果。可以使用join()方法来等待操作完成,并获取操作的结果。
  4. 未正确组合CompletableFuture对象:CompletableFuture类支持将多个CompletableFuture对象进行组合,以实现复杂的异步操作。如果没有正确组合CompletableFuture对象,就无法正确地执行操作。可以使用thenCompose()thenCombine()allOf()等方法来组合CompletableFuture对象,确保操作能够按照预期进行。

综上所述,当在Java中使用CompletableFuture类时,输出没有返回可能是由于未正确设置回调函数、未正确处理异常、未正确等待操作完成或未正确组合CompletableFuture对象所导致的。可以根据具体情况检查代码,并根据需要进行相应的修正。

腾讯云相关产品推荐:

  • 云函数(SCF):腾讯云的无服务器计算产品,可用于快速构建和部署事件驱动型的应用程序。详情请参考:云函数(SCF)产品介绍
  • 弹性容器实例(Elastic Container Instance,简称 ECI):腾讯云的容器实例服务,提供了快速部署和运行容器化应用程序的能力。详情请参考:弹性容器实例(ECI)产品介绍
  • 云数据库 MySQL 版(TencentDB for MySQL):腾讯云的关系型数据库服务,提供了高可用、可扩展的 MySQL 数据库解决方案。详情请参考:云数据库 MySQL 版(TencentDB for MySQL)产品介绍
  • 云原生应用引擎(Cloud Native Application Engine,简称 CNAE):腾讯云的云原生应用托管服务,提供了快速部署和运行云原生应用的能力。详情请参考:云原生应用引擎(CNAE)产品介绍
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java编程思想第五版(On Java8)(二十四)-并发编程

但是这部特别的小说并没有事情搞得一团糟;你可以轻松地走到尽头,永远不会弄明白什么。 构建并发应用程序非常类似于游戏Jenga,每当你拉出一个块并将其放置塔上,一切都会崩溃。...某些内容不正确,编译器不会告诉你。为了使它正确,你必须在研究代码掌握前脑的所有并发问题。 Java的所有非并发领域,“没有明显的错误和没有明显的编译错误”似乎意味着一切都好。...采用原始模型并将其粘贴到复杂语言中Java的大规模扩展迅速暴露了基本问题。Thread的许多方法的弃用以及后续的高级库浪潮,这种情况变得明显,这些库试图提供更好的并发抽象。...false java.lang.RuntimeException: forced 测试A到E运行到抛出异常的地步,然后……什么没有。只有测试F调用get(),我们才能看到抛出的异常。...但是使用旧代码,仍然会遇到旧的解决方案。 本书的其他地方,谈到了Java的一个基本问题:每个失败的实验都永远嵌入语言或库Java并发强调了这个问题。

1.5K31

这篇文章是评论区学到的。

思考 回到我们自己的 Demo ,当我用 CompletableFuture 改造完成之后,还发现了一个小细节。 如果你还记得前一篇文章,那你应该知道是因为父子线程使用了同一个线程池导致的。...使用 CompletableFuture 的写法,如果不指定线程池,也就是这样: 会发什么呢? 程序会正常执行完成: 那么问题就来了:为什么不指定线程池的时候,反而没有问题呢?...其实你从日志输出也能发现端倪: 当前线程ForkJoinPool.commonPool-worker-6 这说明什么? 是不是说明 runAsync 方法内置了一个默认的线程池?...这个 runAsync 方法一进来,我们就直接看到了答案: java.util.concurrent.CompletableFuture#runAsync(java.lang.Runnable) 可以看到...commonPool 方法进来之后直接返回了一个 common 对象,这个对象是 ForkJoinPool : 重启项目之后,可以观察到这个对象是 ForkJoinPool 初始化的时候就生成了:

15410
  • CompletableFuture真香,可以替代CountDownLatch!

    但如果回调嵌入了回调呢?如果层次很深,就是回调地狱。JavaCompletableFuture其实就是Promise,用来解决回调地狱问题。Promise是为了让代码变得优美而存在的。...前者没有返回值,而后者有,否则没有什么两样。 这两组静态函数,都提供了传入自定义线程池的功能。如果你用的不是外置的线程池,那么它就会使用默认的ForkJoin线程池。...这些花样有很多 我们说面说了,CompletableFuture的主要作用,就是让代码写起来好看。配合Java8之后的stream流,可以整个计算过程抽象成一个流。...apply 有入参和返回值,入参为前置任务的输出 accept 有入参无返回值,会返回CompletableFuture run 没有入参也没有返回值,同样会返回CompletableFuture combine...相对于各种回调的嵌套,CompletableFuture为我们提供了更直观、更优美的API。“多个任务等待完成状态”这个应用场景,CompletableFuture已经成了的首选。

    1.4K40

    【小家javaJava8新特性之---CompletableFuture的系统讲解和实例演示(使用CompletableFuture构建异步应用)

    因此为了提高系统整体的并发性能,引入了异步执行~ jdk已经内置future模式的实现。Future是Java5添加的,用来描述一个异步计算的结果。...来addCallback()采用回调函数的形式来提高整体异步性能~ 作为正统Java库,是不是应该加点什么特性,可以加强一下自身库的功能?...JDK8引入重磅库:CompletableFuture Java8里面新增加了一个包含50个方法左右的CompletableFuture....使用案例 Java8CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合...(thenRun使用的是Runnable,若你只是单纯的消费,不需要启用线程,就用thenRun更合适) 上面的方法是计算完成的时候,会生成新的计算结果(thenApply, handle),或者返回同样的计算结果

    2.9K41

    提高效率,实现异步编程,CompletableFuture(上)

    提高效率,实现异步编程,CompletableFuture(上) 大家好,是小高先生,这篇文章将和大家一起学习Java并发编程很重要的一个-CompletableFuture。...接口 特点 Runnable 无返回值 Callable 有返回值 Future 异步任务 当我们Java创建新的线程,通常会使用Runnable接口作为任务的表示形式。...其中一个缺点就是调用get()方法可能会被阻塞。下面代码就是一个正常的使用FutureTask,但是注意一下我们是最后调用的get(),这并没有什么问题。...然而,我们也能发现,实际应用,对于简单的业务场景,使用Future可能没有太大问题,但在复杂的场景下,其效果确实不尽如人意,仿佛身体被掏空。...选出计算速度最快的任务,多个异步任务有一个最快结束返回第一个处理完成的结果。

    22210

    编排并发与响应式初步 发布于 2023

    JavaCompletableFuture允许开发者以声明性的方式描述操作的顺序和依赖性,例如"所有操作完成进行..."或"任何操作完成进行..."。...案例引入 我们可以食堂就餐拆分成这样几步: 当你进入饭堂,首先你想的是今天吃什么,选择合适的档口,比如有米饭、有面、有麻辣香锅。...即一个任务依赖于它之前的多个任务的结果,多元依赖可以通过allOf或anyOf方法来实现,区别是需要多个依赖全部完成使用allOf(完全依赖),多个依赖的任意一个完成即可使用anyOf(部分依赖...它的类型是 Object,因为 CompletableFuture 是一个泛型,可以用于任何类型的计算结果。 CompletableFuture 的计算完成,结果就会被存储在这个变量。...开发更推荐使用需要传入线程池的异步方法,不传递线程池,会使用ForkJoinPool的公共线程池CommonPool,因此所有的异步回调任务都会被挂载到这个公共线程池中,,核心与非核心业务都竞争同一个池中的线程

    36550

    JUC从实战到源码:六千字详细学习CompletableFuture

    CompletableFuture的诞生CompletableFutureJava 8引入的一个,它实现了 Future 接口并提供了更多的功能。...什么是CompletionStageJava 8之前,异步编程通常使用java.util.concurrent.Future接口。...runAsync无返回值方法runAsync()是Java 8CompletableFuture的一个重要方法,用于异步执行没有返回值的任务。...Java,Supplier是一个函数式接口,主要被用来代表一个无参数的函数,返回一个结果。Supplier接口Java 8被引入,主要为了支持Java的函数式编程。...Java,BiConsumer是一个函数式接口,它代表了一个接受两个输入参数并且没有返回类型的方法。也就是说,它代表了可以接受两个参数并且进行某种操作,但不需要返回结果的行为。

    21920

    Java 编程问题:十一、并发-深入探索

    对于任何开发人员来说,并发性都是必需的主题之一,工作面试不能被忽视。这就是为什么这一章和最后一章如此重要。读完本章,您将对并发性有相当的了解,这是每个 Java 开发人员都需要的。...问题 使用以下问题来测试您的并发编程能力。强烈建议您在使用解决方案和下载示例程序之前,先尝试一下每个问题: 可中断方法:编写一个程序,举例说明处理可中断方法的最佳方法。...它返回一个新的CompletableFuture涉及的任何CompletableFuture实例完成,这个新的CompletableFuture就完成了。...原子变量java.util.concurrent.atomic可用。...吃完后,哲学家两个叉子放回桌上,然后由另一个重复同样循环的哲学家拿起。一个哲学家不吃饭,他/她在思考。

    1.1K20

    异步技巧之CompletableFuture

    Future集合某个任务最快结束返回结果。 等待Future结合的所有任务都完成。 通过编程方式完成一个Future任务的执行。 应对Future的完成时间。也就是我们的回调通知。...(Thread.java:745) 我们新建的异步线程中直接New一个异常抛出,我们客户端依然可以获得异常。...: ForkJoinPool.commonPool-worker-1 上面的例子通过工厂方法supplyAsync提供了一个Completable,异步线程输出是ForkJoinPool可以看出当我们不指定线程池的时候会使用...1.3.3计算结果完成的处理 CompletableFuture计算结果完成,我们需要对结果进行处理,或者CompletableFuture产生异常的时候需要对异常进行处理。...JavaCompletableFuture总是遵循这样的原则,下面就不一一赘述了。

    83840

    压测引发的思考——高并发用同步还是异步好?

    并且我们使用的异步的时候没有指定适合我们并发场景的线程池。...其实这也就引出了另一个问题那就是使用CompletableFuture异步的实现,还有CaffeineCache使用,从上面的源码来看,我们的传进来的Function并没有指定对应的线程池,所以就选用了默认线程池...ForkJoinPool 有一个 Async Mode ,效果是工作线程处理本地任务使用 FIFO 顺序**。...因为主线get不到拿不到结果,核心线程也就那几个,很多都进入和ForkJoinPool的无界队列,主线程直接通过park自旋挂起了,还有流量继续进来的时候,也是异步发起获取内存的数据,但是之前还有任务没有执行完继续等...所以没有必要使用再起线程池,最终还是会阻塞等待异步结果的。 设置线程池,想了想这玩意还真没办法,真的就没必要,因为主线程会阻塞等待获取结果的。

    77810

    八个层面比较 Java 8, RxJava, Reactor

    其实很久以前就看完了这篇文章,只不过个人对响应式编程研究的不够深入,羞于下笔翻译,加上这类译文加了原创还有争议性,所以一直没有动力。...结论是:没有结论,觉得只能抱着怀疑的眼光审视这个问题了。...结果被设置给 CompletableFuture ,下一个阶段才开始执行。 Stream - 所有的中间操作都是延迟执行的。...存在订阅者,每一次执行都会从初始点开始完整地执行一边。 4. Asynchronous(异步) CompletableFuture - 这个的要点在于它异步地多个操作连接了起来。...调用方法,线程会一直阻塞,直到有数据到达。 CompletableFuture, Observable, Flowable, Flux - 推模型。

    3.4K60

    并发编程从入门到放弃系列开始和结束

    对于 Java 部分的面试来说,突然想到并发这一块的内容是不太完整的,这篇文章会通篇多线程和并发都大致阐述一遍,至少能够达到了解原理和使用的目的,内容会比较多,从最基本的线程到我们常用的会统一说一遍...锁 隐式锁 没有Lock接口之前,加锁通过synchronzied实现,之前的Java基础系列已经说过了,就不在这里过多的阐述,此处引用之前写过的,更多详细可以看《想进大厂》之Java基础夺命连环...执行monitorexit指令则会把计数器-1,计数器值为0,则锁释放,处于等待队列的线程再继续竞争锁。...容器 这里要说到一些我们平时开发中经常使用到的一些以及他们的实现原理。...而计数器为0,就去执行CyclicBarrier构造函数的回调方法,回调方法执行完成之后,就会退出屏障点,唤醒其他阻塞的线程。

    77720

    使用 CountDownLatch 实现多线程协作

    了解 CountDownLatch 概括 CountDownLatch 是Java 1.5版本推出的一个同步辅助构造需要指定一个计数值,该计数值表示需要等待的事件数量。...每当一个事件完成,计数值就会减一,计数值减至零,等待的线程就会被唤醒继续执行。...,首先通过一个无限循环不断尝试循环中获取当前状态值,如果状态值已经为0,则直接返回false;否则将状态值减1,并尝试原子性地设置状态值,如果设置成功,则返回是否状态值变为0,否则继续循环。...共享资源的状态值为0,表示所有等待的线程都已被释放。...扩展 CompletableFuture简述 JDK 1.8后,java.util.concurrent包提供了CompletableFuture用于支持异步编程和异步任务的处理,相较于CountDownLatch

    19830

    并发编程 | 从Future到CompletableFuture - 简化 Java 的异步编程

    我们也将探讨其与 Future,CompletableFuture 以及 Java 并发包其他工具的对比,理解何时以及为什么需要使用 CompletableFuture。...返回结果return travelPackages;需求终于做完了(叹气声)。此时此刻,生在JDK8+的你,会不会感同身受呢。这还是没有处理异常,没有很多业务代码的前提下。好,现在缓一下我们继续。...分析这趟CompletableFuture异步编程之旅CompletableFutureJava 8 引入的,用于解决使用 Future 遇到的一些问题。...当然,在这里可以为你所有方法都试过一遍,但是你肯定会看的特别累。这样!上面需求中所用到的方法都为你讲解,剩下的请你结合网上的案例学习。...首先,带你回顾了一下Java并发世界的编年史。紧接着,带你体验了一下古人经常使用的Future。感到它的不妙之后,带你回到CompletableFuture

    4.4K111

    理解Java8里面CompletableFuture异步编程

    CompletableFutureJava里面被用于异步编程,异步通常意味着非阻塞,可以使得我们的任务单独运行在与主线程分离的其他线程,并且通过 回调可以主线程得到异步任务的执行状态,是否完成,...Future的主要缺点如下: (1)不支持手动完成 这个意思指的是,提交了一个任务,但是执行太慢了,通过其他路径已经获取到了任务结果,现在没法这个任务结果,通知到正在执行的线程,所以必须主动取消或者一直等待它执行完成...简单的使用CompletableFuture 1,先看一个最简单的例子 主线程里面创建一个CompletableFuture,然后主线程调用get方法会阻塞,最后我们一个子线程 使其终止。...CompletableFutures的执行结果 CompletableFutures执行两个依赖的任务合并,会返回一个嵌套的结果列表,为了避免这种情况我们可以使用thenCompose来返回,直接获取最顶层的结果数据即可...wait 2 seconds 注意由于Anyof返回的是其中任意一个Future所以这里没有明确的返回类型,统一使用Object接受,留给使用端处理。

    16.6K63

    搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文

    又是那个男人,并发大师 Doug Lea 忧天下程序员之忧,解天下程序员之困扰, Java1.8 版本(Lambda 横空出世),新增了一个并发工具 CompletableFuture,它的出现,...几个重要 Lambda 函数 CompletableFuture Java1.8 的版本中出现,自然也得搭上 Lambda 的顺风车,为了更好的理解 CompletableFuture,这里需要先介绍一下几个...supplyAsync 使用 runAsync 是没有返回结果的,我们想获取异步计算的返回结果需要使用 supplyAsync() 方法 CompletableFuture future...我们已经多次说过,get() 方法Future 计算完成之前会一直处在 blocking 状态下,对于真正的异步处理,我们希望的是可以通过传入回调函数,Future 结束自动调用该回调函数,这样,...thenApply 此时使用的是主线程,所以: 串行的后续操作并不一定会和前序操作使用同一个线程 thenAccept 如果你不想从回调函数返回任何结果,那可以使用 thenAccept final

    1.2K10
    领券