5

根据 Goetz 在他的书 JCIP 中的说法:

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

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

4

3 回答 3

4

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

您可以对许多其他在错误位置执行时可能造成“伤害”的方法提出同样的问题。方法就是工具,程序员必须明智地使用这些工具才能创建正确运行的程序。

于 2012-07-13T11:27:27.440 回答
2

我首先建议您阅读Java 并发实践

我想,这个问题可以回答你所说的。

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

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

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

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

于 2012-07-13T11:27:38.780 回答
1

好吧,这绝不是缺陷。(但是,其他方法Thread.stop() 确实如此)

更好的是,它Thread.interrupt()仅在线程被阻塞/等待/睡眠时才影响线程。如果它正在运行interrupt()仅通过设置一个状态变量来要求线程停止这样做,该状态变量可以通过Thread.interrupted()或查询Thread.isInterrupted()

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

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

}

不过要小心Thread.interrupted(),因为它会清除中断状态。

于 2012-07-13T11:45:28.020 回答