我有这样的事情:
// 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 秒),但我不确定是否如此以及为什么。
Collection#parallelStream更简单 - 您需要更少的代码,但您无法控制何时或是否使用并行性。
ExecutorService为您提供了对并行处理的大量控制,但暴露了更多的工作原理,因此您需要更多的代码和更多的知识(但两者都不是很多)。
首先尝试并行流。如果这看起来足够好并且您\xe2\x80\x99 没有处理许多其他请求,那么就到此为止。
\n如果并行性似乎不够,或者如果您正在处理其他请求,请使用执行程序服务,因为所有流共享一个线程池,因此如果它们保持忙碌,其他基于流的代码将冻结。
\n| 归档时间: |
|
| 查看次数: |
458 次 |
| 最近记录: |