在 CPU 上 java 中可以同时运行的最大线程数

2022-09-04 20:08:48

拜托我对某些事情感到困惑。我所知道的是,可以在现代计算机的正常CPU上并发运行的最大线程数范围为8到16个线程。另一方面,使用 GPU 可以同时运行数千个线程,而无需调度程序中断任何线程来调度另一个线程。在几个帖子上,如:Java虚拟机 - https://community.oracle.com/message/10312772 的最大线程数,人们都表示他们在普通CPU上同时运行数千个java线程。这怎么可能??我怎么知道可以并发运行的最大线程数,以便我的代码根据底层体系结构动态调整它。


答案 1

线程不受可用处理器/内核数量的限制或限制。操作系统调度程序可以在单个 CPU 上的任意数量的线程之间来回切换。这就是“先发制人的多任务处理”的含义。

当然,如果线程数多于内核数,则并非所有线程都将同时执行。有些人将被搁置,等待一个时间段。

在实践中,您可以拥有的线程数受调度程序的限制 - 但该数字通常非常高(数千个或更多)。它将因操作系统和各个版本而异。

至于从性能角度来看有多少线程是有用的,正如你所说,这取决于可用处理器的数量以及任务是IO还是CPU限制。试验以找到最佳数字,并在可能的情况下使其可配置。


答案 2

有硬件和软件并发。8 到 16 个线程是指您拥有的硬件 - 即一个或多个 CPU,其硬件可以并行执行 8 到 16 个线程。数千个线程是指软件线程的数量,调度程序必须将它们交换出来,以便每个软件线程都获得其在硬件上运行的时间片。

要获取硬件线程数,可以尝试 。Runtime.availableProcessors()