干净地停止线程

时间:2012-12-07 14:57:20

标签: java multithreading

我终于设法将Thread.interrupt()实现到我的程序而不是Thread.stop()。但我不确定我做得好。

我有一个扩展Thread的类并声明了几个方法。 每个方法都会抛出InterruptedException(每个方法执行I / O密集型操作,其中一些需要几分钟才能完成,因此我没有使用线程安全标志,因为标志不会得到检查直到手术完成后)。我还在这些方法中的几个地方添加了以下代码来抛出异常:

if (this.isInterrupted()) throw new InterruptedException();

在run()方法中,我在try / catch中执行InterruptedException的所有方法。如果被捕获,我会为我的类变量执行Process.destroy()和BufferedReader.close()。

这一切都有效,而且看起来效果很好,但我有几个问题:

  1. 拥有10个以上的方法是否正确,所有方法都会抛出InterruptedException?有更好的方法吗?
  2. 使用isInterrupted()?
  3. 的检查来膨胀方法是否正确?
  4. 在捕获InterruptedException块的末尾,我必须执行'return'或'null'某些值以使线程可用于GC吗?如果我重新创建Thread,则初始化需要比平时更长的时间。
  5. 最后,是否存在与我所做的相关的任何问题/改进?
  6. 提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

Java 中的线程中断并不意味着停止执行该线程。它不会停止,它是中断。当一些基本和关键的变化时,线程可以被中断,告诉线程它的执行上下文,它的任务或它的环境以某种显着的方式发生了变化。线程对此消息的反应是特定于实现的。它可以是停止,可以重启或任何其他动作。不处理中断的线程不能被中断,但其行为仍然可以改变,例如,使用共享变量。

例如,假设您有许多线程,都在搜索问题空间的一部分以寻找解决方案。当一个线程找到解决方案时,它可以中断其他线程,因为它们对解决方案的搜索不再相关。已经找到了解决方案。

或者想象一个连续工作的主线程和一个网络通信线程。每次网络线程收到消息时,用消息中断工作线程。根据消息和上下文的内容,工作者线程可以决定下一步该做什么。例如,如果消息是“STOP”,则它可以立即停止所有执行。如果消息是“RESET”,它可以从头开始,也可能不是从头开始,并根据执行上下文重用一些以前的工作。

  

拥有超过10种方法是正确的,所有方法都抛出   InterruptedException?有更好的方法吗?

不,只要你知道自己在做什么,这就完全没问题了。如果您实现中断只是停止线程,则无需抛出InterruptedExceptions。线程的run()方法是第一个,异常不再是堆栈。

  

使用isInterrupted()检查方法膨胀是否正确?

视具体情况而定。通常会在某些关键代码之前添加检查。通常它被添加为循环块中的第一项。

  

在捕获InterruptedException块的末尾,我必须执行一个   'return'或'null'某些值使线程可用   GC?如果我重新创建线程,它需要比平时更长的时间   初始化。

没有。一旦线程从run()方法存在,它就离开了GC的怜悯。共享变量不会被GC,只要它们仍被其他对象引用。