gpt4 book ai didi

java - 在 Java 中同时运行多少个线程是可取的?

转载 作者:行者123 更新时间:2023-11-30 02:52:50 26 4
gpt4 key购买 nike

在看了 Java virtual machine - maximum number of threads 之后,我是 Java 中多线程的新手。 Java/Android 应用程序可以运行的线程数似乎没有限制。但是,有一个可取的限制吗?我的意思是,是否有多个线程,如果你运行超过这个数字那么它是不明智的,因为你无法确定哪个线程在什么时间做什么?我希望我的问题是有道理的。

最佳答案

有一些建议的限制,但它们与跟踪它们并没有任何关系。

  1. 大多数多线程都带有锁定。如果您使用中央数据存储或全局可变状态,那么您拥有的线程越多,您将获得越多的锁争用。这是特定于应用程序的,取决于您拥有多少所述状态以及线程读取和写入它的频率。
  2. 默认情况下,桌面 JVM 没有限制,但有操作系统限制。现代 Windows 机器应该有数万个,但不要依赖创建更多的能力。
  3. 并行运行多个任务很棒,但硬件只能应付这么多。如果您使用的是有时会被激发的小线程,并且大部分时间都在闲置,那没什么大不了的(Java 服务器多年来都是这样编写的)。但是,如果您的线程非常密集,那么使它们的数量超过您拥有的内核数量可能不会给您带来任何好处。 (如果您预计线程有时会空闲,我相信标准做法是内核数量的两倍)。
  4. 线程是有代价的。每当你切换线程时,你就会切换上下文,虽然它并不那么昂贵,但经常这样做会损害性能。创建一个线程来对两个整数求和并写回结果不是一个好主意。
  5. 如果线程需要了解彼此的状态,那么它们的速度会大大降低,因为它们的大量写入必须写回主内存。线程最适合用于需要很少相互交互的独立任务。

长话短说
取决于操作系统和硬件:在服务器上创建数千个线程很好,在台式机上你应该将自己限制在 50-200 并仔细选择你对它们的处理方式。

注意:Android 默认和建议的“UI 多线程助手”- AsyncTask 实际上不是线程。它是从 ThreadPool 调用的任务,因此使用它没有限制或惩罚。它对其生成和重用它们而不是创建新线程的线程数有上限。大多数 Android 应用程序应该使用它而不是生成自己的线程。一般来说,线程池相当普遍,除非您被迫进行阻塞操作,否则它是一个不错的选择。

关于java - 在 Java 中同时运行多少个线程是可取的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23834533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com