我想阻止一个帖子。在停止我的线程时我得到线程中断异常。
如果线程抛出中断异常,我该怎么办?我应该抓住它,什么也不做,或者我是否需要做任何事情?
答案 0 :(得分:4)
你不应该“只是停止”一个线程。我主要做的是在Thread的类中创建一个公共(可能是静态的)变量,指示线程何时应该停止。所以像是
的声明public volatile bool shouldStop = false;
然后,在你的线程的每个循环结束时,你可以检查你是否需要退出(从while循环或其他东西中断)。
处理线程非常烦人!可以在一个线程本身上调用中断/停止功能,但主要是不需要的。
答案 1 :(得分:2)
有一个原因.stop()和.suspend()已弃用,不应使用。这篇文章是相关的: http://download.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
我也引用了Javadocs:
已过时。这种方法本质上就是这样 不安全的。使用停止线程 Thread.stop使它解锁所有 它锁定的监视器(作为 无法控制的自然结果 传播的ThreadDeath异常 堆栈)。如果有任何对象 以前受这些监视器保护 处于不一致的状态, 受损的物体变得可见 其他线程,可能导致 任意行为。许多用途 应该用代码替换stop 只需修改一些变量即可 表明目标线程应该 停止运行。目标线程应该 定期检查这个变量,和 从它的run方法返回 如果变量有序时尚 表示它将停止运行。 如果目标线程等待很长时间 句点(在条件变量上,用于 例如),中断方法应该 习惯于打断等待。对于 更多信息,请参阅为什么 Thread.stop,Thread.suspend和 Thread.resume已弃用?。
您应该找到一些方法(无论是通过某些共享变量还是其他方式)来同步您的线程,以便线程可以自行结束。
答案 2 :(得分:1)
这取决于您的需求。你可以(例如)做这样的事情:
public void run() {
try {
// do thread stuff
} catch(ThreadInterruptedException ex) {
// close gracefully what needed to be closed
}
}
但是stop method is deprecated。所以更好的解决方案是放置一些布尔变量来指示线程是否应该停止,并提供一个方法来更改它以停止线程(例如,参见this question)。