Java 中嵌套的 CompletableFuture 问题

文章讲述了Java8的CompletableFuture如何以异步方式执行任务,及其在ForkJoinPool中线程管理的细节,包括并行度设置、嵌套任务可能导致的问题和潜在解决方案。
摘要由CSDN通过智能技术生成

CompletableFuture在 Java 8 中引入,用于以异步方式执行事物。这有助于防止主线程等待完成主线程执行不需要的特定代码块的执行。 如果没有作为参数传递的自定义执行程序,则使用 Threads from 执行。
CompletableFuture ForkJoinPool.commonPool()
如果并行度小于 2,则为提交的每个异步任务创建一个新线程。 将具有基于集合的线程数。
CompletableFuture ForkJoinPool.commonPool() java.util.concurrent.ForkJoinPool.common.parallelism property
java.util.concurrent.ForkJoinPool.common.parallelism设置为缺省值,其值等于运行 JVM 的系统中可用的内核数。例如,如果我们在 4 个 CPU 的机器上运行 JVM,那么 的值将为 4,并且还将创建 4 个线程。我们可以通过在启动时通过 — 传递此参数来增加此值。此属性不能在运行时修改,必须在 JVM 启动期间设置为命令行参数。
java.util.concurrent.ForkJoinPool.common.parallelism ForkJoinPool.commonPool()java.util.concurrent.ForkJoinPool.common.parallelism
Djava.util.concurrent.ForkJoinPool.common.parallelism=
嵌套在代码中会在应用程序获得大量请求来执行它时产生问题。例如,在代码中,有一个 ,而 又包含另一个 。1 和 2 都需要分配单独的线程来执行分配的任务。在这种情况下,它需要来自它们的两个线程来执行任务。如果在执行此代码时应用程序中没有其他请求,并且并行度为 4,它将成功运行。它将获取可用的线程,并且任务将成功执行。如果有更多请求进入应用程序,则需要更多线程来执行这些嵌套任务。可能会耗尽线程,并且应用程序可能会陷入挂起的情况,而无法处理请求。
CompletableFuture CompletableFuture1 CompletableFuture2 CompletableFuture ForkJoinPool.commonPool() ForkJoinPool.commonPool() CompletableFuture ForkJoinPool.commonPool()
例如,如果我们在 CPU 计数为 4 的机器上运行应用程序,那么默认情况下将有 4 个线程。如果应用程序同时收到 4 个请求,那么它将输入 ,并尝试执行 ,它将等待线程,因为所有线程都已忙于执行。这将使应用程序进入一种挂起状态,并且它不会继续处理当前的 4 个请求以及将要到达此嵌套代码的请求。它还可能阻止在其中使用的其他请求的处理。
ForkJoinPool.commonPool() CompletableFuture1 CompletableFuture2 ForkJoinPool.commonPool() CompletableFuture1 CompletableFuture CompletableFuture
若要解决此问题,可以将参数增加到更高的值作为短期解决方法。这可能会解决上述博客中提到的情况,但如果同时有多个请求等于或大于参数值集,则会发生这种情况。此外,有时,即使收到并发请求时存在毫秒的变化,或者代码块以更快的方式执行,也可能不会发生此问题。作为对这种情况的永久修复,最好避免像这样嵌套异步任务,因为它具有使用更多线程的开销以及进入挂起情况的可能性。
java.util.concurrent.ForkJoinPool.common.parallelism java.util.concurrent.ForkJoinPool.common.parallelism
CompletableFuture

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小徐博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值