我处于一种奇怪的境地。在我的web服务器(tomcat)中,在web请求中,我基本上需要取消之前的请求。我有一个执行上一个请求的线程的引用。所以我可以直接中断该线程,节点将完成剩下的工作。
我知道你不打算打断你不拥有的主题。但在这种情况下中断tomcat线程是否安全?可能是另一种方式?维护自己的线程池浪费资源和ovehead
答案 0 :(得分:3)
维护自己的线程池是浪费资源,但它也是所有其他方面的收获,例如应用程序服务器的稳定性。因此,您需要确定哪些更重要:几千字节的内存和CPU周期或稳定可靠的应用程序。
中断另一个线程的问题是你通常无法确定其他线程在代码中的位置。您可能希望对此使用锁定:
线程A在可以安全中断的情况下锁定某些东西,线程B检查锁定,如果它无法获取,它会中断A。
但是当A即将放弃锁定,B检查锁定,A解锁并以清理开始,B发送中断时会发生什么?
所以你应该真正使用自己的线程池。
答案 1 :(得分:1)
我不会这样做。不是100%肯定为什么,但我认为这些线程来自Tomcat自己的工作线程池并且一个接一个地杀死它们/最终会导致无响应的Tomcat实例。 (这只是一个假设)。
我认为“维护自己的线程池是浪费资源和开销”。我认为这是一个小问题,线程池是伟大的家伙,不要害怕它们。我不知道您的应用程序的详细信息,但我认为如果您通过JConsole测量开销,您可以决定进行一些优化,并且线程池不可能是瓶颈。
最好的想法是我建议你完全重新设计:使用短回复的HTTP请求通过向ExecutorService
提交任务或在后台启动长时间运行的异步操作东西。这样就不需要损害Tomcat自己的线程,并且从用户/客户端的角度来看,也可以改善应用程序的整体可用性。
总结一下:我认为做你提到的事情是不安全的,并且在上一段中描述了一种可能的其他方式来做你想要的事情。