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

时间:2014-05-23 16:46:12

标签: java android multithreading

我不熟悉Java中的多线程,在查看Java virtual machine - maximum number of threads之后,看起来Java / Android应用程序可以运行的线程数量没有限制。但是,是否有可取的限制?我的意思是,是否存在许多线程,如果你超过这个数字那么它是不明智的,因为你无法确定什么线程什么时候做什么?我希望我的问题有道理。

1 个答案:

答案 0 :(得分:1)

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

  1. 大多数多线程都带有锁定功能。如果您使用中央数据存储或全局可变状态,那么您拥有的线程越多,您获得的锁争用就越多。这是特定于应用程序的,取决于您拥有多少所述状态以及线程读取和写入的频率。
  2. 默认情况下,桌面JVM没有限制,但存在操作系统限制。对于现代Windows机器,应该有数万个,但不要依赖于创建更多功能的能力。
  3. 并行运行多个任务很棒,但硬件只能处理这么多。如果你使用的是有时会被激活的小线程,并且花费大部分时间闲置,那就没什么大不了的(Java服务器多年来都是这样编写的)。但是,如果您的线程非常密集,那么制作它们的数量超过您拥有的核心数量就不太可能带来任何好处。 (我相信标准做法是核心数量的两倍,如果你预计线程有时会闲置)。
  4. 线程会给他们带来成本。每当你切换线程时你都会切换上下文,虽然它不是那么昂贵,但不断地做它会损害性能。创建一个Thread来总结两个整数并写回结果并不是一个好主意。
  5. 如果线程需要对彼此状态的可见性,那么它们会大大减慢,因为它们的大量写入必须写回主存储器。线程最适合用于彼此之间几乎不需要交互的独立任务。
  6. <强> TL; DR
    取决于操作系统和硬件:在服务器上创建数千个线程很好,在台式机上你应该将自己限制在50-200并仔细选择你用它们做什么。

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