应用程序级线程池和tomcat

时间:2017-08-07 03:58:44

标签: java multithreading tomcat

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

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

2 个答案:

答案 0 :(得分:0)

将连接器配置为最多1000个线程时,连接器最多可包含1000个线程。它不会检查同一个VM中可能有多少个线程处于活动状态。

您没有说明如何分配自定义线程池,但我从未遇到过将其允许的线程数与系统中正在发生的其他线程相关联的线程池。比内存不足了。)

你答案的理由是1500。

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

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

答案 1 :(得分:0)

Java的后台线程池实际上是由基础库的某些部分重用的。因此,如果您运行并行化流,则所有这些流都使用完全相同的线程池。

由于我之外的原因,Apache软件倾向于复制基础Java库,这意味着Tomcat使用自己版本的线程池,该线程池与基础库线程池无法兼容或重新使用。

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