我创建了一个名为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
}
}
}
我的问题是关于最终块和停止()方法
由于上面的类正在实现Runnable,所以我可以创建这个类的对象并通过调用 start()方法启动它的一个线程。我也知道我可以停止这个线程使用 stop()(是的,我知道它已被弃用)方法。
我想要澄清的是,如果我需要在ThreadClass的对象上调用stop方法,那么即使线程被停止,我也可以依赖 finally 块来执行调用 stop(),因为我在finally块中做了一些重要的结束事情。
答案 0 :(得分:3)
线程#停止通过抛出一个ThreadDeath异常来工作,它不会像System.exit吹走JVM那样瞬间消除线程。 ThreadDeath甚至可以被捕获,尽管这不是一个好主意。所以尝试块仍然是相关的。
然而,复杂的是,如果线程已多次调用它,那么,如果在线程处于finally块中时调用第二个停止,则可以从finally块抛出它,以便finally块将那不完整。如果线程的清理需要一段时间,那么很可能在它上面多次调用stop。
或者即使你只调用stop一次,如果在调用stop时线程恰好已经执行了finally块,那么stop会干扰完成finally块。
这类似于technotes on Thread primitive deprecation指出的内容:
1)一个线程几乎可以在任何地方抛出一个ThreadDeath异常。考虑到这一点,所有同步的方法和块都必须非常详细地研究。
2)线程在从第一个(在catch或finally子句中)清理时可以抛出第二个ThreadDeath异常。清理必须重复,直到成功为止。确保这一点的代码非常复杂。
因此,有些情况存在问题,要确保清理工作正常进行是非常困难的。詹姆斯'评论是正确的,如果可能的话,你应该使用这种事情的中断,以便线程可以可靠地完成其业务。