nob*_*alG 5 java multithreading
我创建了一个名为 ThreadClass 的类(如您所见,这是一个线程),其结构类似于以下内容
class SomeTask implements Runnable
{
boolean someCondition=true;
public void run() {
try
{
while(someCondition)
{
//Here goes the Process Code
}
}
catch(Exception errorException)
{
//Catching the Exception
}
finally
{
////I expect that this finally should run every time ,whatever happens in the world
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是关于finally块和stop()方法
由于上面的类正在实现 Runnable,所以我可以创建这个类的对象并通过调用start()方法启动它的一个线程。我也知道我可以使用stop()停止这个线程(是的,我知道它已被弃用) 方法。
我想澄清的是,如果我需要以某种方式调用 ThreadClass 对象上的 stop 方法,那么即使线程通过调用stop()停止,我也可以依靠finally块来执行,因为我正在做一些重要的事情在 finally 块中关闭东西。
Thread#stop 通过抛出 ThreadDeath 异常来工作,它不会像 System.exit 吹走 JVM 那样立即消除线程。ThreadDeath 甚至可以被捕获,尽管这不是一个好主意。所以 try 块仍然相关。
然而,让事情变得复杂的是,如果线程多次调用 stop ,那么如果当线程位于 finally 块中时调用第二个 stop ,那么它可能会从finally块中抛出,从而导致finally块不会完成。如果线程的清理需要一段时间,那么可能会多次调用 stop 。
或者,即使您只调用 stop 一次,如果调用 stop 时线程恰好已经在执行其finally 块,那么 stop 也会干扰finally 块的完成。
这类似于Thread 原语弃用的技术说明中指出的内容:
1)线程几乎可以在任何地方抛出ThreadDeath异常。考虑到这一点,所有同步方法和块都必须进行非常详细的研究。
2) 线程在清理第一个 ThreadDeath 异常时(在 catch 或 finally 子句中),可以抛出第二个 ThreadDeath 异常。清理工作必须重复进行,直到成功为止。确保这一点的代码将非常复杂。
因此,在某些情况下会出现问题,很难确保正确完成清理工作。詹姆斯的评论是正确的,如果可能的话,您应该对这种事情使用中断,以便线程能够可靠地完成其业务。
| 归档时间: |
|
| 查看次数: |
1435 次 |
| 最近记录: |