我们使用
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 及其虚拟线程 :-(