是否有 Java Future 实现,如果池繁忙,它将在调用者线程中执行?

问题描述 投票:0回答:1

我们使用

ExecutorService
并行对云存储进行各种 REST 调用,我们担心池可能会因阻塞的调用而变得繁忙,然后长时间阻塞新的调用(云超时可能是几个)完成所有重试后几分钟)。当然,我们总是可以添加越来越多的线程,但我在 C++ 中实现的一种解决方案是,如果任务尚未开始,则让
Future.get()
在调用者线程中运行。 Java almost 使用
Executors.newWorkStealingQueue()
做到了这一点,但是只有当调用者本身是池线程时,才会启用 run-in-caller 逻辑:

class ForkJoinTask {
  private int awaitDone(...) {
      ...
      if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) {
        // execute in caller thread

这就是工作窃取如何防止递归算法耗尽线程。但如果调用者是普通线程,则不会触发此逻辑。

ForkJoinPool
没有什么不同,因为
Executors.newWorkStealingQueue()
只是它的包装。 Java 中有什么东西支持我所追求的吗?

PS:我们还不能使用 JDK 21 及其虚拟线程 :-(

java multithreading concurrency
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.