可以同时运行多少个线程?

4
我正在学习Java中的多线程和并发。阅读了许多关于此话题的帖子,但仍不清楚。请耐心等待我的解答。
首先,我有一个疑问,一些人说可以同时运行的线程数相当于处理器核心数(n=处理器核心数),这是正确的吗?我真的不确定这个说法是否正确。
但是我已经阅读过,我们可以在JVM中创建任意数量的线程,它只取决于我们为JVM分配的内存。这是正确的吗?
我们应该如何决定在一个Java程序中并行运行的线程数量?是否与处理器核心有关?

https://dev59.com/Qm445IYBdhLWcg3wpb4P#4759606 - Elliott Frisch
@ElliottFrisch,先生,我看过那篇文章。但是我很好奇,知道处理器有多少核心对于并行运行多个线程是否很重要?还是只需要检查JVM内存分配? - Elena
这是机器上可以运行的线程数量(总数)。请注意,现代操作系统也会进行抢占式时间片。Java线程是作为本地线程实现的。 - Elliott Frisch
1
您可以创建任意数量的线程,但一个核心一次只能运行一个线程。 - tkausl
1
如果一次只能执行一个线程,那么其他线程在那个时刻会做什么?等待被处理器处理吗?那么如果线程像排队等待处理器处理,则多线程的用途是什么? - Elena
显示剩余2条评论
1个回答

4
线程数可以并行运行的数量等于(n=处理器核心数)。
是的,这个说法是正确的。
理论上来说,我们可以在JVM中创建任意数量的线程,这只取决于我们分配给JVM的内存。这个说法是正确的吗?
理论上是的。您可以在JVM中创建尽可能多的线程,直到出现OutOfMemoryError为止。但是,创建线程是一个昂贵的任务,因此作为最佳实践,请考虑使用共享线程池。这可以通过使用ExecutorService框架来实现。

你也可能会用尽堆栈段空间,堆栈段被分配给线程,因此同时运行的线程越多,每个线程的堆栈就越小,这增加了 StackOverflowException 的可能性(尽管对于大多数应用程序来说,堆栈通常相当大)。 - cleberz
1
现在大多数的CPU都支持超线程技术,因此2个、4个甚至8个线程都是可能的。 - GhostCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接