Tomcat:当 HTTP 连接关闭时,终止在请求线程中产生的线程

Ash*_*iya 5 java multithreading tomcat tomcat6 threadpool

在 Tomcat 6/7 中:

1)说在请求线程中我们执行了一些任务;调用其他网络服务,DB .. 等。当客户端关闭 HTTP 连接时,请求线程是否被终止/终止以停止任何正在运行的任务?如果没有,如何终止?

2)如果,在请求线程中我们执行一些并行任务,产生一些新线程(使用具有固定池大小的 ExecutorService)。在 HTTP 连接关闭的情况下,如何终止/杀死请求线程内产生的这些线程?

Jos*_*nez 1

Tomcat 有一个名为 minSpareThreads 的属性。未使用的线程将被销毁,除非它位于 minSpareThreads 内。

minSpareThreads
始终保持运行的最小线程数。如果未指定,则使用默认值 10。

在 HTTP 连接 close 的情况下,如何终止/终止请求线程内生成的这些线程?

有多种方法可以实现这一点。首先需要注意的是,在正常的 Tomcat 使用情况下,Servlet 处理请求时,您不会收到有关连接关闭的通知。但 Tomcat 确实具有高级 IO 功能,如果 Tomcat 将连接关闭视为错误并向您发送该链接中提到的 CometEvent(需要进一步测试),则可以使用这些功能来拦截连接关闭。

现在假设您要么等待线程完成(超时),要么通过某种方式获得连接关闭通知,那么您将不得不中断工作线程(您试图停止)。这通常分两步完成。1)将共享原子或易失性布尔对象设置为描述“停止处理”的值,这是一种控制标志。2)然后中断你的线程。工作线程应该摆脱任何阻塞方法,然后可以检查共享变量(控制标志)是否设置为“停止”。如果您的工作线程在某些代码的一次迭代后自然停止,您可以跳过步骤 1。一些线程保持在循环中,直到它们的控制标志设置为“停止”。如果您使用 ExecutorService,那么它的 shutdownNow 方法通常会向其池中运行的所有线程发送 Thread.interrupt。