2017-08-07 85 views
0

假设一个java应用程序有它自己的线程池来支持并发任务执行,并且总共有500个线程被分配给它。 Tomcat还配置为通过连接器配置支持总共1000个线程。应用程序级线程池和tomcat

1000个线程的连接器配置是否充当500个线程应用程序线程池的超集或是这两个独立的线程池?这是否意味着共有1000个线程被分配给已部署的应用程序,还是500 + 1000 = 1500?

回答

0

当您将连接器配置为具有最多1000个线程时,连接器将最多有1000个线程。它不会检查同一虚拟机中可能有多少线程处于活动状态。

你没有说明你如何分配你的自定义线程池,但我从来没有遇到过一个线程池,它将允许的线程数与系统中正在发生的其他线程相关联(除了耗尽的记忆)。

你回答的原因是1500那么。

它也很容易找到:只需将系统置于应该使用1000个线程处理的负载下并导致线程转储。当您使用1000个线程配置连接器时,显然是这样做的,因为您已经测量出您处理的卷的尺寸合适,这意味着您有负载测试,可以轻松生成该负载。

而不是产生所有这些线程,我想建议调查java.util.concurrent.Executor及其亲属。

+0

我只使用java.util.concurrent库来创建和使用自定义线程池。 –

0

Java的后台线程池实际上被基本库的某些部分重新使用。因此,例如,如果您运行一个并行化的流,则完全相同的线程池将用于所有这些流。

由于超出了我的理由,Apache软件倾向于复制基本Java库,这意味着Tomcat使用自己版本的线程池,该线程池与基本库线程池没有任何兼容或重新使用。

实际上,如果运行500个Java基本库线程池线程和1000个Tomcat线程,那么您正在运行1500个线程。如果考虑到线程切换花费很小,那么拥有如此多的活动线程会导致系统在线程处理上花费大量时间,而不是执行实际的代码。多少完全取决于内部和负载,但是对于你描述的情况的一个有根据的猜测是线程切换浪费CPU时间的5-15%左右。