我一直在处理一个应用程序(java-6),我需要在表单提交时终止一个线程。 应用程序处理多个请求,每个都有“终止我”按钮,用户点击按钮,我得到线程ID,我标记线程中断。
我曾经经常调用代码的一部分(Logging),我定期检查CurrentThread
是否被标记,如果是,则抛出RunTimeException
。这就是我过去能够终止线程的方式。不幸的是,由于重构,此部分已被删除,现在我找不到足够频繁检查currentThread
是否被标记的合适位置。
一种不同的方法是以某种方式“强制”线程定期检查他们自己的状态(如果被标记为中断则抛出异常)。如果我通过扩展Thread
或实现Runnable
来编写每个线程,那将是相当容易的,但事实并非如此。有没有办法(可能在Java 7中)执行“正常”线程?
答案 0 :(得分:1)
Java线程在设计上是合作的(除非您想使用已弃用的stop()
方法 - 它已被弃用了。)
因此,如果一个线程在它的死亡中没有合作,那么你几乎无能为力。有几种方法可以检查中断的标志并抛出InterruptedException
。
但除非你正确处理异常(它清除了标志,如果你无法处理它,你需要再次设置它),标志很容易丢失。
您需要更改代码以重新引入检查。如果他们不允许你更改代码,那么我知道了几个技巧(比如在构建中用固定版本替换JAR中的类文件)。但最后,你真的必须改变消息来源。