【发布时间】:2012-12-07 14:57:20
【问题描述】:
我终于设法在我的程序中实现了 Thread.interrupt() 而不是 Thread.stop()。但是我不确定我是否做得很好。
我有一个类,它扩展了 Thread 并声明了几个方法。 EVERY 方法已经抛出 InterruptedException(每个方法执行 I/O 密集型操作,其中一些需要几分钟才能完成,因此我没有使用线程安全标志,因为标志不会得到检查直到操作完成后)。我还在这些方法中的几个地方添加了以下代码来引发异常:
if (this.isInterrupted()) throw new InterruptedException();
在 run() 方法中,我为 InterruptedException 执行 try/catch 中的所有方法。如果被捕获,我会为我的类变量执行 Process.destroy() 和 BufferedReader.close()。
这一切都有效,而且似乎效果很好,但是我有几个问题:
- 10个以上的方法都抛出InterruptedException是否正确?有没有更好的方法来做到这一点?
- 通过检查 isInterrupted() 来膨胀方法是否正确?
- 在 catch InterruptedException 块结束时,我是否必须执行“返回”或“空”某些值以使线程可用于 GC?如果我重新创建线程,初始化时间会比平时长。
- 最后,是否有任何与我所做的相关的问题/改进?
提前感谢您的帮助!
【问题讨论】:
-
最干净和最简单的方法是拥有一个(线程安全)标志,您可以在线程本身中切换。使用 interrupt() 通常由非常健壮的应用程序使用,以避免许多可能的陷阱。
-
@Skynorth 谢谢,也许值得一提的是这些方法执行 IO 密集型操作,并且在这些操作(有时需要 2 分钟以上)完成之前不会检查标志。
-
我不认为你真的想知道“正确”(Q's 1&2);这是编译器的问题,它是否在所有合理情况下都按照您的预期运行,我们已经(可能)从您的描述中知道。
-
@DonalFellows 也许正确不是正确的词,他们可以改进吗?
标签: java multithreading