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

增加线程数会降低java的整体性能吗?,java,multithreading,Java,Multithreading,我有一个java springs的应用程序。应用程序需要多线程处理。所以我使用callable&executor服务,因为每个线程都将返回一些字符串值。 所以我的问题是如何确定可以保持的最大线程数? 重要的问题是,如果我继续增加线程数,但考虑到堆大小的情况,那么在线程数超过某个限制后,会不会开始降低性能?计算要使用多少线程的最佳方法是根据经验。但是你可以提前猜;如果你正在做大量的阻塞IO,你会需要更多的线程。如果您根本不做任何IO,只使用CPU,那么理想情况下,您不需要比内核更多的线程。您还必须

我有一个java springs的应用程序。应用程序需要多线程处理。所以我使用callable&executor服务,因为每个线程都将返回一些字符串值。 所以我的问题是如何确定可以保持的最大线程数?
重要的问题是,如果我继续增加线程数,但考虑到堆大小的情况,那么在线程数超过某个限制后,会不会开始降低性能?

计算要使用多少线程的最佳方法是根据经验。但是你可以提前猜;如果你正在做大量的阻塞IO,你会需要更多的线程。如果您根本不做任何IO,只使用CPU,那么理想情况下,您不需要比内核更多的线程。您还必须考虑同步开销,如果需要大量同步,那么在多个线程上运行该代码并不能提高性能的可能性很小。
同样,这在很大程度上取决于应用程序。这些都是经验法则,您必须执行更详细的分析和一些测试运行,才能真正判断您的应用程序。

计算要使用多少线程的最佳方法是根据经验。但是你可以提前猜;如果你正在做大量的阻塞IO,你会需要更多的线程。如果您根本不做任何IO,只使用CPU,那么理想情况下,您不需要比内核更多的线程。您还必须考虑同步开销,如果需要大量同步,那么在多个线程上运行该代码并不能提高性能的可能性很小。
同样,这在很大程度上取决于应用程序。这些都是经验法则,您必须执行更详细的分析和一些测试运行,才能真正判断您的应用程序。

好吧,对这些问题的最佳答案是“视情况而定”。但我可以肯定地指出,这取决于什么:)

  • 你正在线程中进行的工作
  • 代码是否已经利用了底层硬件的并行性
  • 在整个代码中是否存在比并行任务花费更多时间的瓶颈
在JVM中获得线程基础设施是一个代价高昂的过程,当您谈到线程时,同步也就出现了。让我们暂时忘记同步。即使这样,如果正在执行的任务的开销低于分配和管理线程的开销,我也会严格拒绝多线程

  • 事实证明,当您的主要任务是进行网络呼叫并且有许多这样的任务时,多线程是一个福音

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

注意:编译器现在每天都会进行一些优化,以提高代码的并行处理能力。但是,用正确的方式编写代码的更大责任取决于您

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

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

明智地选择:)

好吧,这类问题的最佳答案是“视情况而定”。但我可以肯定地指出,这取决于什么:)

  • 你正在线程中进行的工作
  • 代码是否已经利用了底层硬件的并行性
  • 在整个代码中是否存在比并行任务花费更多时间的瓶颈
在JVM中获得线程基础设施是一个代价高昂的过程,当您谈到线程时,同步也就出现了。让我们暂时忘记同步。即使这样,如果正在执行的任务的开销低于分配和管理线程的开销,我也会严格拒绝多线程

  • 事实证明,当您的主要任务是进行网络呼叫并且有许多这样的任务时,多线程是一个福音

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

注意:编译器现在每天都会进行一些优化,以提高代码的并行处理能力。但是,用正确的方式编写代码的更大责任取决于您

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

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

明智地选择:)

简单的答案是肯定的,因为线程之间的交换非常昂贵。您必须在交换等待的线程之间取得平衡,以便其他线程能够以交换为代价获得一些CPU


例如,如果一个典型的生产商有100个消费线程,我怀疑吞吐量会比有10个线程大得多。

简单的答案是肯定的,因为线程之间的交换非常昂贵。您必须在交换等待的线程之间取得平衡,以便其他线程能够以交换为代价获得一些CPU


例如,如果一个典型的生产商有100个消费线程,我怀疑吞吐量会比有10个线程大得多。

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

  • 在大多数情况下,由于CPU/内核的数量有限,可以并发运行的线程数量有限
  • 将一个线程置于
    等待
    状态,同时激活另一个线程,这是所谓的
    上下文切换
    的一部分,在CPU资源方面相当昂贵
  • Amdahl定律为这个问题提供了答案-线程数、CPU数、部分“工作”可以同时完成以及由此产生的加速之间的关系是什么。很难在这里发布公式,所以我就离开了

很可能是的,这将降低整体性能。