停止线程时出现问题

时间:2011-06-08 16:41:36

标签: java multithreading

我想阻止一个帖子。在停止我的线程时我得到线程中断异常。

如果线程抛出中断异常,我该怎么办?我应该抓住它,什么也不做,或者我是否需要做任何事情?

3 个答案:

答案 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)。