当我们有多台核心机器并具有Java并发性时,跨多个核心的多个线程是可能的。另外,我们确实有Java流,可以帮助分发工作。
但是,我们如何确保线程在内核之间正确分配,以便我们有效利用内核?
Windows和Linux操作系统之间的线程分布有何不同?在英特尔和AMD处理器之间有何不同?我们需要针对不同的操作系统和处理器以特定方式处理线程吗?
答案 0 :(得分:1)
Java Thread使用基础操作系统的本机线程功能。因此,在Java中,除了Thread类允许您传递给OS的任何值外,您都无法控制OS如何运行Thread。 Java和OS如何处理这些值取决于OS和Java实现。
我不觉得您是高级系统程序员,所以我建议您让Java处理效率。
答案 1 :(得分:1)
通常,您希望将计算线程的数量与硬件线程的数量相匹配。
这是ForkJoinPool
的默认行为,可以通过其他构造函数进行配置,或者对于公用池,可以通过java.util.concurrent.ForkJoinPool.common.parallelism
系统属性进行配置。如果系统上正在进行其他计算密集型工作,则可能需要降低此值。 Stream API似乎没有指定行为(我可能是错的),但是合理的实现将使用当前的ForkJoinPool
(即当前任务的池正在运行,或者如果在任何外部运行,则为公共池)池)。
与以往一样,并行性可能会使您的程序速度变慢或变慢。
调度线程位于平台上,通常委托给操作系统。过去,某些JRE实现已将Java线程在OS线程之间移动,但这与处理I / O阻塞有关。