多个 Java 线程并控制跨多个内核的线程分配

Multiple Java threads and control over thread distribution across muliple cores

当我们有多个核心机器并具有 Java 并发时,跨多个核心的多个线程是可能的。此外,我们在 Java 中确实有流,可以帮助分发工作。

但是,我们如何确保线程在核心之间正确分布,以便我们有效地利用核心?

windows 和 Linux 操作系统的线程分布有何不同? Intel 和 AMD 处理器之间有何不同?我们是否需要针对不同的 OS 和处理器以特定方式处理线程?

Java 线程使用底层 OS 的本机线程设施。因此,在 Java 内,您无法控制 OS 如何运行线程,除了线程 class 允许您传递给 OS 的任何值。 Java 和 OS 如何处理这些值取决于 OS 和 Java 实现。

我不觉得你是高级系统程序员,所以我建议你让 Java 处理效率。

通常您希望将计算线程的数量与硬件线程的数量相匹配。

这是 ForkJoinPool 的默认行为,可通过其他构造函数配置,或者对于公共池,java.util.concurrent.ForkJoinPool.common.parallelism 系统 属性。如果系统上正在进行其他计算密集型工作,您可能希望降低此值。 Stream API 似乎没有指定行为(我可能是错的),但合理的实现会使用当前的 ForkJoinPool (即当前任务的池在 运行 中,或者如果 运行 在任何池之外,则为公共池)。

与以往一样,并行性可能会使您的程序速度下降或上升。

线程调度取决于平台,通常委托给操作系统。过去的一些 JRE 实现在 OS 线程之间移动了 Java 线程,但这是关于处理 I/O 阻塞。