我有这样的事情:
// sequential version
for(var t: tasks){
// run() is a time consuming method (approx. 20-30 seconds)
t.run();
}我有大约。1000 (独立)任务和以上需要大约。1000x25秒。run()-method是专用的 CPU密集型(不涉及 I/O操作)。
我转到了parallelStream:
// parallel version
tasks.parallelStream().forEach(Task:run);并且用parallelStream测量每个task.run()需要大约。15-20秒。因此,它肯定比使用顺序版本要快一些。
我是否可以使用parallelStream (以及它的叉连接)来进行这样长时间的运行操作(每个task.run()都需要大约。或者将executorServices与自定义线程池一起使用(例如,由于系统稳定性、性能等原因)?
我想知道在这样长时间运行的任务中使用parallelStream (叉-联接)是否有什么害处。我认为分叉连接应该只用于非常短的运行任务(最大)。1-2秒),但我不确定是否如此,以及为什么。
发布于 2021-12-26 00:57:55
Collection#parallelStream更简单--您需要更少的代码,但是您无法控制何时或即使使用并行性。
ExecutorService为您提供了对并行处理的大量控制,但公开了更多的工作,因此您需要更多的代码和更多的知识(但两者都不多)。
先尝试并行流。如果这看起来足够好,而且您没有处理其他许多请求,那么就在这里结束。
如果并行性似乎不够,或者如果您正在处理其他请求,则使用executor服务,因为所有流共享一个线程池,因此如果它们保持忙碌,其他基于流的代码将冻结。
https://stackoverflow.com/questions/70483582
复制相似问题