最大线程数,可以在Java CPU上并发运行的最大线程数

问题描述 投票:9回答:4

请让我对某些事情感到困惑。我所知道的是,现代计算机的普通CPU上可以同时运行的最大线程数为8到16个线程。另一方面,使用GPU可以同时运行数千个线程,而无需调度程序中断任何线程来调度另一个线程。在以下几篇文章中:Java virtual machine - maximum number of threadshttps://community.oracle.com/message/10312772人们声称他们在正常CPU上同时运行数千个Java线程。这怎么可能??我又如何知道可以同时运行的最大线程数,以便我的代码根据基础体系结构自动进行自我调整。

java multithreading gpu cpu
4个回答
9
投票

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

当然,如果您的线程数多于内核数,那么并非所有线程都将执行同时。一些将被保留,等待一个时隙。

实际上,您可以拥有的线程数受调度程序的限制-但是该线程数通常很高(数千个或更多)。不同的操作系统和不同的版本会有所不同。

从性能的角度来看,

关于多少线程有用,正如您所说的,这取决于可用处理器的数量以及任务是受IO还是CPU约束。尝试找出最佳数量,并在可能的情况下使其可配置。


4
投票

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

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


1
投票

在任何给定时间,处理器将运行的线程数等于所包含的内核数。这意味着在单处理器系统上,在任何给定时刻都只运行一个线程(或没有线程)。

但是,处理器不会一个接一个地运行每个线程,而是在多个线程之间快速切换以模拟并发执行。如果不是这种情况,更不用说创建多个线程了,您甚至将无法启动多个应用程序。

Java线程(与处理器指令相比)是CPU要处理的一组指令的非常高级的抽象。当下降到处理器级别时,无法保证在任何给定时间哪个线程将在哪个内核上运行。但是,考虑到处理器在这些线程之间快速切换,理论上可以创建无限数量的线程,尽管这是以性能为代价的。

[如果您考虑一下,现代计算机可以同时运行数千个线程(组合所有应用程序),而只有1〜16(典型情况)的内核数。没有此任务切换,将一事无成。

如果要优化应用程序,则应考虑手头工作而不是基础体系结构所需的线程数量。应当权衡从并行性获得的性能收益,以防止增加线程执行开销。由于每台机器都不同,每个运行时环境也不同,因此计算出金线程数是不切实际的(但是,可以通过基准测试并查看内核数来进行估算)。


0
投票

尽管所有其他答案都说明了从理论上讲您如何才能在应用程序中拥有数千个线程,却以内存为代价,并且其他开销已经得到了很好的解释here。但是,值得注意的是concurrencyLevel包中提供的数据结构的默认java.util.concurrent为16。

如果不考虑一致性,则会遇到一致性错误。

使用大大超过所需的值会浪费空间和时间,而大大降低的值会导致线程争用。

请确保已设置适当的concurrencyLevel,以防遇到与线程数更多的并发相关的问题。

© www.soinside.com 2019 - 2024. All rights reserved.