java 禁止使用Thread.stop方法

字面意义上来说,Thread.stop可以终止一个线程。但是为什么要禁止使用这个方法?

 

首先应该明确一点:一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以Thread.stop(),(同样的原因还有Thread.suspend(), Thread.resume())都已经被废弃了。

为什么禁止使用stop方法?那是因为stop方法不安全。

为什么stop方法不安全?实际上stop方法是在一个线程中强行关闭别的线程。这样会导致什么问题?下面举几个例子:

一、资源回收问题

线程A调用线程B的stop方法去停止线程B,调用这个方法的时候线程A其实并不知道线程B执行的具体情况,这种突然地停止会导致线程B的一些清理工作无法完成。

比如说假如线程B正在执行数据库操作,线程A突然就把线程B给stop掉了,那么线程B中的数据库链接该怎么关闭呢?线程B中方法才执行到一半,那些局部变量要怎么释放呢?

二、数据不同步问题

执行stop方法后线程B会马上释放锁,这有可能会引发数据不同步问题。

在这里验证一下stop方法对锁的释放:

testLock.java

如果不使用stop方法,结果为:

这说明thread1和thread2都在正确地征用同一个锁对象。先是thread1获得了lock,然后释放lock。然后thread2获得了lock,然后释放lock。但是如果使用了stop方法,那么结果为:

可以看到thread1抛出了java.lang.ThreadDeath错误。同时thread的lock被破坏掉了,只有thread2获得了lock。因为锁被破坏,所以当前线程可能不安全。再看一个例子:

test.java

这里的dao应该是一个线程安全的类,如果不使用stop方法,输出永远是1和2。但是如果使用stop方法中断thread1,那么thread2的输出有时候会是1,有时候会是2。这说明stop导致线程不安全,出现了数据不同步的问题。

三、总结

总之stop等一系列被Deprecated的方法都不应该继续使用了。会引发各种各样莫名其妙的问题。