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