gpt4 book ai didi

java - 具有阻塞 I/O 的 RecursiveAction/ForkJoinPool

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:11 25 4
gpt4 key购买 nike

我有一个 Java 客户端需要递归调用服务器来检索大型数据图 - 需要大约一千次调用。我无法控制服务器,这是时间关键的崩溃恢复场景所必需的。

我的问题是我需要在所有调用完成之前阻塞我的原始线程。

来自 java.util.concurrent 的 RecursiveAction 和 ForkJoinPool 抽象正是我所需要的,除了它们是为 CPU 并行性而设计的并且禁止使用阻塞 I/O。

那么,什么是实现递归网络调用的最佳方式,启动线程阻塞直到所有调用完成?

附加上下文信息:

  • 我无法修改服务器。
  • 服务器允许并支持这种繁重的查询。
  • 我会将并发网络调用的数量限制在 10-30 左右。
  • 在磁盘上缓存数据是不可行的。

其他想法:将单相 Phaser 与 ThreadPoolExecutor 结合使用是否合适?调用任务将调用 Phaser.register(),进行调用,提交子任务,然后调用 Phaser.arrive()。启动线程将调用 Phaser.awaitAdvance(1)。这是最合适的方法吗?

最佳答案

使用 JDK1.7 Phasers 可以很好地工作。我使用的模式是这样的:

private void loadGraphFromServer() {
final Phaser phaser = new Phaser(1); // "1" registers the calling thread
for (final Item item : getDataListFromServer()) {
phaser.register();
executorService.submit(new Runnable() {
public void run() {
try {
getMoreDataFromServer(item.getSomeId());
// more nested loops/tasks/calls here...
}
finally {
phaser.arrive();
}
}
});
}
phaser.arriveAndAwaitAdvance(); // blocks until all tasks are complete
}

关于java - 具有阻塞 I/O 的 RecursiveAction/ForkJoinPool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9630476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com