Java Parallel Stream是否会在当前任务完成后立即拾取下一个任务?
Java parallelStream 多线程执行疑问解答
ids.parallelStream().map(f) 确实是多线程执行的,底层依赖ForkJoinPool管理线程池(默认线程数与CPU核心数挂钩)。
针对你描述的场景:f(2)耗时10ms、f(5)耗时100ms、f(1)耗时90ms这种情况,**完全会出现f(2)执行完成后,f(5)仍在运行时就启动f(1)**的情况——甚至如果线程池有足够空闲线程,f(2)、f(5)、f(1)还有可能同时启动执行。
这里补充几个需要注意的细节:
- 默认ForkJoinPool的线程数等于
Runtime.getRuntime().availableProcessors(),如果任务数量超过线程数,某个线程完成手头任务后会立刻去取下一个任务执行;如果任务数不多于线程数,多个任务会直接并行启动。 - parallelStream的任务拆分和调度由框架自动处理,无需手动管理线程,但如果你的函数f涉及共享的非线程安全变量,必须做好同步,否则会出现数据异常。
- 别忘了流的惰性特性:如果只调用
map(f)而没有添加终端操作(比如collect()、forEach()),整个流根本不会执行,这点很容易踩坑。
内容的提问来源于stack exchange,提问作者William Buttlicker
相关产品推荐
相关产品推荐

