【问题标题】:Tomcat: Terminating threads spawned inside request-thread when HTTP connection is closedTomcat:当 HTTP 连接关闭时,终止在请求线程内产生的线程
【发布时间】:2015-08-02 11:28:48
【问题描述】:

在 Tomcat 6/7 中:

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

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

【问题讨论】:

标签: java multithreading tomcat threadpool tomcat6


【解决方案1】:

a.) 线程继续运行。当/如果它最终返回某个东西时,它将因套接字异常而失败,因为它试图写入的连接已经关闭。在普通的 servlet api 中,您无法告诉线程何时关闭连接。

b.) 如果您产生额外的线程,观察它们的一种简单方法是使用 java 并发包中的 Callables 和 Futures。这为您提供了一种处理超时的便捷方式。在此处查看文档:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html

这里:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html

无论如何,您将负责监视线程并确保它们不会永远运行,您的 servlet 容器不会为您执行此操作。

【讨论】:

    【解决方案2】:

    Tomcat 有一个名为 minSpareThreads 的属性。除非在 minSpareThreads 中,否则未使用的线程将被销毁。

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

    在 HTTP 连接关闭的情况下,如何终止/杀死请求线程内产生的这些线程?

    有多种方法可以做到这一点。首先需要注意的是,在正常的 Tomcat 使用下,一个 Servlet 处理一个请求,你不会收到连接关闭的通知。但是 Tomcat 确实有advanced IO features,如果 Tomcat 将其视为错误并将其发送给您该链接中提到的 CometEvent(需要进一步测试),则可以使用它来拦截关闭连接。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      相关资源
      最近更新 更多