我终于设法将Thread.interrupt()实现到我的程序而不是Thread.stop()。但我不确定我做得好。
我有一个扩展Thread的类并声明了几个方法。 每个方法都会抛出InterruptedException(每个方法执行I / O密集型操作,其中一些需要几分钟才能完成,因此我没有使用线程安全标志,因为标志不会得到检查直到手术完成后)。我还在这些方法中的几个地方添加了以下代码来抛出异常:
if (this.isInterrupted()) throw new InterruptedException();
在run()方法中,我在try / catch中执行InterruptedException的所有方法。如果被捕获,我会为我的类变量执行Process.destroy()和BufferedReader.close()。
这一切都有效,而且看起来效果很好,但我有几个问题:
提前感谢您的帮助!
答案 0 :(得分:2)
Java 中的线程中断并不意味着停止执行该线程。它不会停止,它是中断。当一些基本和关键的变化时,线程可以被中断,告诉线程它的执行上下文,它的任务或它的环境以某种显着的方式发生了变化。线程对此消息的反应是特定于实现的。它可以是停止,可以重启或任何其他动作。不处理中断的线程不能被中断,但其行为仍然可以改变,例如,使用共享变量。
例如,假设您有许多线程,都在搜索问题空间的一部分以寻找解决方案。当一个线程找到解决方案时,它可以中断其他线程,因为它们对解决方案的搜索不再相关。已经找到了解决方案。
或者想象一个连续工作的主线程和一个网络通信线程。每次网络线程收到消息时,用消息中断工作线程。根据消息和上下文的内容,工作者线程可以决定下一步该做什么。例如,如果消息是“STOP”,则它可以立即停止所有执行。如果消息是“RESET”,它可以从头开始,也可能不是从头开始,并根据执行上下文重用一些以前的工作。
拥有超过10种方法是正确的,所有方法都抛出
InterruptedException
?有更好的方法吗?
不,只要你知道自己在做什么,这就完全没问题了。如果您实现中断只是停止线程,则无需抛出InterruptedExceptions。线程的run()方法是第一个,异常不再是堆栈。
使用isInterrupted()检查方法膨胀是否正确?
视具体情况而定。通常会在某些关键代码之前添加检查。通常它被添加为循环块中的第一项。
在捕获InterruptedException块的末尾,我必须执行一个 'return'或'null'某些值使线程可用 GC?如果我重新创建线程,它需要比平时更长的时间 初始化。
没有。一旦线程从run()方法存在,它就离开了GC的怜悯。共享变量不会被GC,只要它们仍被其他对象引用。