4

我终于设法在我的程序中实现了 Thread.interrupt() 而不是 Thread.stop()。然而,我不确定我是否做得很好。

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

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

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

这一切都有效,而且似乎效果很好,但是我有几个问题:

  1. 10多个方法都抛出InterruptedException是否正确?有一个更好的方法吗?
  2. 通过检查 isInterrupted() 来膨胀方法是否正确?
  3. 在 catch InterruptedException 块结束时,我是否必须执行“返回”或“空”某些值以使线程可用于 GC?如果我重新创建线程,它需要比平时更长的时间来初始化。
  4. 最后,是否有与我所做的相关的任何问题/增强功能?

在此先感谢您的帮助!

4

1 回答 1

3

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

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

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

有超过 10 种方法是否正确,所有这些方法都 throw InterruptedException?有一个更好的方法吗?

不,这很好,只要您知道自己在做什么。如果您实现中断只是为了停止线程,则无需抛出 InterruptedExceptions。线程的 run() 方法是它的第一个方法,并且异常不会进一步进入堆栈。

通过检查 isInterrupted() 来膨胀方法是否正确?

视上下文而定。检查通常会在一些关键代码之前添加。通常它作为循环块中的第一项添加。

在 catch InterruptedException 块结束时,我是否必须执行“返回”或“空”某些值以使线程可用于 GC?如果我重新创建线程,它需要比平时更长的时间来初始化。

不。一旦线程从 run() 方法中存在,它就任由 GC 摆布。共享变量不会被 GC,只要它们仍然被其他对象引用。

于 2012-12-08T01:36:09.507 回答