正确使用并行流进行图书馆开发

时间:2019-07-13 01:29:53

标签: java concurrency java-stream

使用并行流,很容易同时运行一个长时间运行的方法,

data.parallelStream()
    .map(this::longRunningMethod)
    .collect(Collectors.toList());

乍一看,此功能看起来不错,但是进一步深入研究并行流代码后,您发现该代码正在ForkJoinPool类中的公共池上运行。当您为自己编写应用程序时,这似乎是合理的,因为您可以完全控制代码库,并且可以根据需要更改内容。但是,将库分发给其他用户时,由于共享公共池,并行流的使用可能会影响用户在并行流中运行的任务,反之亦然,并且用户只能更改其代码,而不能更改您的库正在使用。

我的问题是,在编码严重依赖通过并行流进行异步调用的库时,并行流的正确用法是什么?您应该按原样使用公共池,还是应该在编写的库中使用单独的公共池来使用?

以下是单独的池概念的示例:

// Loaded properties for the library
Properties libraryProperties;

// This defined somewhere globally for usage in the library
static final ForkJoinPool forkJoinPool = new ForkJoinPool(libraryProperties.getProperty("library-common-pool-parallelism"));

// This called in the library code instead of plain parallel stream
forkJoinPool.submit(() ->
    data.parallelStream()
        .map(this::longRunningMethod)
        .collect(Collectors.toList())
).get();

本文旨在更多地讨论在Java中创建并发库时正确的方式或可接受的方式。我的假设是对库使用单独的池是更好的做法,但是我也可以看到使用公共池的优点。

修改

我最初的问题以一个长期运行的方法为例,但是如果长期运行的方法类似于许多阻塞服务调用,答案是否会改变。

0 个答案:

没有答案