我在java spring中有一个应用程序。该应用程序需要多线程。所以我使用callable&执行程序服务,因为每个线程将返回一些字符串值。 所以我的问题是如何确定可以保留的最大线程数? 重要的问题是,如果我继续增加线程数但是要注意堆大小的条件,那么在线程数超过某个限制后,这是否会降低性能?
答案 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)
很可能是的,这会降低整体表现。以下是一些需要考虑的事实:
WAITING
状态并激活一些其他线程,这是所谓的context switching
的一部分,在CPU资源方面非常昂贵; 答案 3 :(得分:0)
简单的答案是肯定的,因为在线程之间进行交换非常昂贵。你必须在交换正在等待的线程之间取得平衡,以便其他线程可以通过交换的费用获得一些CPU。
例如,如果您有一个典型的生产者有100个comsumer线程,我怀疑吞吐量会比你有10个时大得多。