Thread.stop(),最后

时间:2015-03-31 06:29:29

标签: 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
        }
    }

}

我的问题是关于最终块和停止()方法

由于上面的类正在实现Runnable,所以我可以创建这个类的对象并通过调用 start()方法启动它的一个线程。我也知道我可以停止这个线程使用 stop()是的,我知道它已被弃用)方法。

我想要澄清的是,如果我需要在ThreadClass的对象上调用stop方法,那么即使线程被停止,我也可以依赖 finally 块来执行调用 stop(),因为我在finally块中做了一些重要的结束事情。

1 个答案:

答案 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异常。清理必须重复,直到成功为止。确保这一点的代码非常复杂。

因此,有些情况存在问题,要确保清理工作正常进行是非常困难的。詹姆斯'评论是正确的,如果可能的话,你应该使用这种事情的中断,以便线程可以可靠地完成其业务。