gpt4 book ai didi

java - ForkJoinPool和异步IO

转载 作者:搜寻专家 更新时间:2023-10-31 20:31:49 25 4
gpt4 key购买 nike

在我的一个用例中,我需要从多个节点获取数据。每个节点维护一个数据范围(分区)。目标是尽快读取数据。约束是,分区的基数在手之前是未知的。使用工作共享方法,我可以将分区分割成子分区并并行获取数据。这种方法的一个缺点是,一个线程可能会获取大量数据并花费更多时间,而另一个线程可能完成得更快。另一种方法是使用工作窃取,我们可以将分区分成更小的范围并使用forkjoinpool。这种方法的缺点是,如果分区是稀疏的,我们可以多次往返到服务器,以意识到没有子分区的数据。
我的问题是,如果我想使用forkjoinpool,任务可以在其中执行一些i/o操作,我该如何做?从fj池的文档和我迄今为止阅读的最佳实践来看,fj池似乎不适合阻塞io操作。如果我想使用非阻塞IO,我该怎么做?

最佳答案

fork-join框架是ExecutorService接口的一个实现,它通过尝试使用所有可用的处理器核心来帮助加快并行处理。将代码包装在ForkJoinTask子类中,通常使用它的一个更特殊的类型,即RecursiveTask(它可以返回结果)或RecursiveAction

// create sub tasks
// submit them to the common Fork/Join pool
ForkJoinTask.invokeAll(subTaskOne, subTaskTwo);
// Merge the results

接下来回到Java中的异步编程。在java8中进行异步的唯一方法是使用 CompletionStage API。这个api可以使用公共fork/join池,也可以将自己的 ExecutorService与之连接。
下面是一个将fork/join池与异步io一起使用的示例。
Runnable task = () -> System. out .println ("Hello world!" );
CompletableFuture <Void > completableFuture = CompletableFuture.runAsync (task);

默认情况下,这些任务在公共fork/join池中运行。

关于java - ForkJoinPool和异步IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52450387/

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