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

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

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

1.5K31

一文带你读懂企业常用异步编程核心工具类CompletableFuture

大家好,我是程序员牛肉。 CompletableFuture 作为 Java 异步编程的核心工具,其底层设计巧妙融合了任务编排、线程调度和状态管理。其也成为了企业在开发异步编程的时候绕不开的工具类。...不知道什么是CompletetableFuture可以先看看我之前写的这篇文章: 还在用Future搞异步?快看看企业中常用的CompletableFuture是怎么用的!...2024-11-19 [CompletableFuture 是 Java 8 引入的一个类,用于支持异步编程和构建复杂的异步任务流水线。...最后,通过原子操作 compareAndSet 尝试将当前栈顶元素从 h 更新为 c,如果在这期间栈顶元素没有被其他线程修改,则更新成功并返回 true,否则返回 false。...也就是说CompletableFuture的默认线程池只有在双核以上的机器内才会使用。在双核及以下的机器中,会为每个任务创建一个新线程,等于没有使用线程池,且有资源耗尽的风险。

7610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

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

    17110

    CompletableFuture真香,可以替代CountDownLatch!

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

    1.5K40

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

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

    3.3K41

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

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

    23010

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

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

    38550

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

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

    23920

    还在用Future搞异步?快看看企业中常用的CompletableFuture是怎么用的!

    大家好,我是程序员牛肉。 不知道你们在使用多线程的时候会用什么方式来获取异步结果?大多数人接触的首个方法肯定是使用Future来获取异步结果。...1.Future接口中没有关于异常处理的方法,这对于我们的项目开发来讲是一个很憋屈的点。使用Future的时候需要我们在任务执行时捕获异常,然后将异常封装到 Future 对象中返回。...Completablefuture类中的常用方法。...今天关于CompletableFuture的介绍就到这里了,本篇也主要是向大家介绍这么一个异步工具类去使用,不涉及底层原理。希望我的文章可以帮到你。...对于CompletableFuture你有什么想说的嘛?欢迎在评论区留言。 关注我,带你了解更多计算机干货。

    11510

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

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

    1.1K20

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

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

    82510

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

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

    3.5K70

    异步技巧之CompletableFuture

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

    84440

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

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

    78920

    使用 CountDownLatch 实现多线程协作

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

    21230

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

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

    4.8K113

    理解Java8里面CompletableFuture异步编程

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

    16.6K63
    领券