增加的线程数会降低java中的整体性能吗?

时间:2014-05-03 10:00:54

标签: java multithreading

我在java spring中有一个应用程序。该应用程序需要多线程。所以我使用callable&执行程序服务,因为每个线程将返回一些字符串值。 所以我的问题是如何确定可以保留的最大线程数? 重要的问题是,如果我继续增加线程数但是要注意堆大小的条件,那么在线程数超过某个限制后,这是否会降低性能?

4 个答案:

答案 0 :(得分:3)

根据经验,确定使用多少线程的最佳方法。但你可以提前猜出;如果你正在做很多阻塞IO,你会想要更多线程。如果您根本没有使用任何IO并且只使用CPU,那么理想情况下您不需要比核心更多的线程。您还必须考虑同步开销,如果您需要大量同步,那么在多个线程上运行该代码很可能不会提高性能。

同样,它在很大程度上取决于应用程序。这些都只是经验法则,您必须执行更详细的分析和一些测试运行才能真正告诉您的应用程序。

答案 1 :(得分:1)

嗯,这些问题的最佳答案是"它取决于"。但我绝对可以指出,取决于它取决于:)

  • 您在线程中所做的工作。
  • 代码是否已经在利用底层硬件的并行特性?
  • 整个代码中是否存在瓶颈,这将比并行任务花费更多时间?

获取JVM中的线程基础结构是一个代价高昂的过程,当您谈到线程时,同步也会出现。让我们暂时忘记同步。即便如此,如果正在执行的任务的头数低于分配和管理线程的开销,我会对多线程说严格的NO。

  • 当您的主要任务是进行网络呼叫并且有许多此类任务时,事物被多线程证明是一个福音。

  • 另一个这样的要求是做一些独立的计算,比如块方式矩阵乘法。

注意:编译器现在需要做一些优化来改善代码的并行处理能力。但是以正确的方式编码它的更大责任取决于你。

例如:考虑以下代码在数组中添加10个数字。

for(int i = 0 ; i < 10 ; i++){
    total += a[i];
}

这似乎是添加数组元素的最佳方式。但下面实际上是在利用处理器的并行处理能力:

total = a[0] = a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] + a[8] + a[9];

明智地选择:)

答案 2 :(得分:1)

很可能是的,这会降低整体表现。以下是一些需要考虑的事实:

  • 在大多数情况下,由于CPU /核心数量有限,您可以同时运行有限数量的线程;
  • 将一个线程置于WAITING状态并激活一些其他线程,这是所谓的context switching的一部分,在CPU资源方面非常昂贵;
  • Amdahl定律,它提供了问题的答案 - 线程数,CPU之间的关系,“工作”的一部分可以同时进行以及由此产生的加速。在这里发布公式很难,所以我只留下wiki page link

答案 3 :(得分:0)

简单的答案是肯定的,因为在线程之间进行交换非常昂贵。你必须在交换正在等待的线程之间取得平衡,以便其他线程可以通过交换的费用获得一些CPU。

例如,如果您有一个典型的生产者有100个comsumer线程,我怀疑吞吐量会比你有10个时大得多。