什么或谁应该打断一个线程?

时间:2012-07-13 11:03:47

标签: java java.util.concurrent

Goetz在他的书JCIP中说:

  

因为每个线程都有自己的中断策略,所以除非您知道中断对该线程的意义,否则不应该中断线程。

为什么Java语言提供public interrupt ()方法呢?这是一个设计缺陷吗?谁或什么应该打断一个线程?

3 个答案:

答案 0 :(得分:4)

他的意思是,如果你不知道一个线程是做什么以及它是如何工作的,你就不应该打断它。由于所有线程都可以被中断,因此在类interrupt()中使用Thread方法是合乎逻辑的。

对于在错误的地方执行时可能会造成“伤害”的许多其他方法,你可能会问同样的事情。方法是工具,程序员必须明智地使用这些工具才能创建一个正常工作的程序。

答案 1 :(得分:2)

我首先建议您阅读Java Concurrency in Practice

我认为,这question可以回答你提到的内容。

顺便说一句,让我们看看我们如何阻止线程。我们可以通过使用Thread类的3种方法中的任何一种来阻止线程执行:

  1. yield()
  2. join()
  3. sleep()
    1. yield()方法暂时暂停当前正在执行的线程,以便有机会执行相同优先级的剩余等待线程。如果没有等待线程或所有等待线程的优先级较低,则同一线程将继续执行。产生执行机会的屈服线程由线程调度程序决定,其行为依赖于供应商。

    2. join()如果任何执行线程t1在t2上调用join(),即; t2.join()立即t1将进入等待状态,直到t2完成执行。

    3. sleep()根据我们的要求,我们可以让线程在指定的时间段内处于休眠状态。

答案 2 :(得分:1)

嗯,这不是一个缺陷,绝不是。 (但是,其他方法,如Thread.stop()确实是)

使Thread.interrupt()更好的原因是它只会在线程被阻塞/等待/休眠时影响线程。如果它正在运行interrupt(),则仅通过设置状态变量要求线程停止这样做,可以通过Thread.interrupted()Thread.isInterrupted()

查询

通常,这是让线程从run()方法返回而不是以任何方式从外部停止它们的最佳方法。

void run() {
    while(!isInterrupted())
        //executed

}

但请注意Thread.interrupted(),因为它会清除中断状态。