增加线程数会降低java的整体性能吗?
我有一个java springs的应用程序。应用程序需要多线程处理。所以我使用callable&executor服务,因为每个线程都将返回一些字符串值。 所以我的问题是如何确定可以保持的最大线程数?增加线程数会降低java的整体性能吗?,java,multithreading,Java,Multithreading,我有一个java springs的应用程序。应用程序需要多线程处理。所以我使用callable&executor服务,因为每个线程都将返回一些字符串值。 所以我的问题是如何确定可以保持的最大线程数? 重要的问题是,如果我继续增加线程数,但考虑到堆大小的情况,那么在线程数超过某个限制后,会不会开始降低性能?计算要使用多少线程的最佳方法是根据经验。但是你可以提前猜;如果你正在做大量的阻塞IO,你会需要更多的线程。如果您根本不做任何IO,只使用CPU,那么理想情况下,您不需要比内核更多的线程。您还必须
重要的问题是,如果我继续增加线程数,但考虑到堆大小的情况,那么在线程数超过某个限制后,会不会开始降低性能?计算要使用多少线程的最佳方法是根据经验。但是你可以提前猜;如果你正在做大量的阻塞IO,你会需要更多的线程。如果您根本不做任何IO,只使用CPU,那么理想情况下,您不需要比内核更多的线程。您还必须考虑同步开销,如果需要大量同步,那么在多个线程上运行该代码并不能提高性能的可能性很小。
同样,这在很大程度上取决于应用程序。这些都是经验法则,您必须执行更详细的分析和一些测试运行,才能真正判断您的应用程序。计算要使用多少线程的最佳方法是根据经验。但是你可以提前猜;如果你正在做大量的阻塞IO,你会需要更多的线程。如果您根本不做任何IO,只使用CPU,那么理想情况下,您不需要比内核更多的线程。您还必须考虑同步开销,如果需要大量同步,那么在多个线程上运行该代码并不能提高性能的可能性很小。
同样,这在很大程度上取决于应用程序。这些都是经验法则,您必须执行更详细的分析和一些测试运行,才能真正判断您的应用程序。好吧,对这些问题的最佳答案是“视情况而定”。但我可以肯定地指出,这取决于什么:)
- 你正在线程中进行的工作李>
- 代码是否已经利用了底层硬件的并行性李>
- 在整个代码中是否存在比并行任务花费更多时间的瓶颈
- 事实证明,当您的主要任务是进行网络呼叫并且有许多这样的任务时,多线程是一个福音
- 另一个这样的要求是做一些独立的计算,比如分块矩阵乘法
例如:考虑下面的代码在数组中添加10个数字。
for(int i = 0 ; i < 10 ; i++){
total += a[i];
}
明智地选择:)好吧,这类问题的最佳答案是“视情况而定”。但我可以肯定地指出,这取决于什么:)
- 你正在线程中进行的工作李>
- 代码是否已经利用了底层硬件的并行性李>
- 在整个代码中是否存在比并行任务花费更多时间的瓶颈
- 事实证明,当您的主要任务是进行网络呼叫并且有许多这样的任务时,多线程是一个福音
- 另一个这样的要求是做一些独立的计算,比如分块矩阵乘法
例如:考虑下面的代码在数组中添加10个数字。
for(int i = 0 ; i < 10 ; i++){
total += a[i];
}
明智地选择:)简单的答案是肯定的,因为线程之间的交换非常昂贵。您必须在交换等待的线程之间取得平衡,以便其他线程能够以交换为代价获得一些CPU
例如,如果一个典型的生产商有100个消费线程,我怀疑吞吐量会比有10个线程大得多。简单的答案是肯定的,因为线程之间的交换非常昂贵。您必须在交换等待的线程之间取得平衡,以便其他线程能够以交换为代价获得一些CPU
例如,如果一个典型的生产商有100个消费线程,我怀疑吞吐量会比有10个线程大得多。很可能是的,这会降低总体性能。以下是一些需要考虑的事实:
- 在大多数情况下,由于CPU/内核的数量有限,可以并发运行的线程数量有限李>
- 将一个线程置于
状态,同时激活另一个线程,这是所谓的等待
的一部分,在CPU资源方面相当昂贵李>上下文切换
- Amdahl定律为这个问题提供了答案-线程数、CPU数、部分“工作”可以同时完成以及由此产生的加速之间的关系是什么。很难在这里发布公式,所以我就离开了