ForkJoinPool和异步IO

时间:2018-09-21 19:58:53

标签: java java-8 forkjoinpool

在我的一个使用案例中,我需要从多个节点获取数据。每个节点维护一个数据范围(分区)。目的是尽可能快地读取数据。约束条件是,分区的基数事先未知。使用工作共享方法,我可以将分区分为多个子分区,并并行获取数据。这种方法的一个缺点是,一个线程可能会获取大量数据并花费更多时间,而另一个线程可能会更快地完成。另一种方法是使用工作窃取,在这里我们可以将分区分成更小的范围,并使用ForkJoinPool。这种方法的缺点是,如果分区稀疏,我们可以多次往返于服务器,以了解子分区没有数据。

我的问题是,如果我想使用ForkJoinPool,那么任务可以在其中执行一些I / O操作,我该怎么做?从FJ池的文档以及到目前为止我阅读的最佳实践来看,FJ池似乎不适合阻止IO操作。如果我想使用非阻塞IO,该怎么办?

1 个答案:

答案 0 :(得分:1)

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池中运行。

相关问题