耗时方法的并行流

nim*_*o23 5 java java-stream

我有这样的事情:

// sequential version
for(var t: tasks){ 
    // run() is a time consuming method (approx. 20-30 seconds)
    t.run();
}
Run Code Online (Sandbox Code Playgroud)

我有大约。1000 个(独立)任务,以上需要大约。1000 x 25 秒。-方法run()是CPU 密集型的(不涉及I/O 操作)。

我切换到并行流:

// parallel version
tasks.parallelStream().forEach(Task:run);
Run Code Online (Sandbox Code Playgroud)

并测量了parallelStream每个task.run()需求的大约值。15-20 秒。所以它肯定比使用顺序版本快一点。

我可以使用parallelStream(及其 fork-join)进行如此长时间运行的操作(每个操作task.run()大约需要 15-20 秒)还是与自定义线程池一起使用会更好executorServices(例如,因为系统稳定性、性能等) ?

我想知道使用parallelStream(fork-join)执行如此长时间运行的任务是否有任何危害。我认为 fork-join 应该只用于非常短的运行任务(最多 1-2 秒),但我不确定是否如此以及为什么。

Boh*_*ian 3

Collection#parallelStream更简单 - 您需要更少的代码,但您无法控制何时或是否使用并行性。

\n

ExecutorService为您提供了对并行处理的大量控制,但暴露了更多的工作原理,因此您需要更多的代码和更多的知识(但两者都不是很多

\n

首先尝试并行流。如果这看起来足够好并且您\xe2\x80\x99 没有处理许多其他请求,那么就到此为止。

\n

如果并行性似乎不够,或者如果您正在处理其他请求,请使用执行程序服务,因为所有流共享一个线程池,因此如果它们保持忙碌,其他基于流的代码将冻结。

\n

  • @nimo23 你的应用程序的活力..:这意味着你的程序可能无法取得进展或者可能无法及时响应。请参阅[此](https://docs.oracle.com/javase/tutorial/essential/concurrency/liveness.html) (2认同)