首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java Thread有关问题集之Thread.stop()篇

2012-10-29 
Java Thread问题集之Thread.stop()篇http://yeziwang.iteye.com/blog/844649为什么不能使用Thread.stop()

Java Thread问题集之Thread.stop()篇

http://yeziwang.iteye.com/blog/844649

为什么不能使用Thread.stop()方法?

从SUN的官方文档可以得知,调用Thread.stop()方法是不安全的,这是因为当调用Thread.stop()方法时,会发生下面两件事:

1. 即刻抛出ThreadDeath异常,在线程的run()方法内,任何一点都有可能抛出ThreadDeath Error,包括在catch或finally语句中。

2. 释放该线程所持有的所有的锁

?

当线程抛出ThreadDeath异常时,会导致该线程的run()方法突然返回来达到停止该线程的目的。ThreadDetath异常可以在该线程run()方法的任意一个执行点抛出。但是,线程的stop()方法一经调用线程的run()方法就会即刻返回吗?

?

?

"Caught?in?main:?"?+?t);??
  • ????????????t.printStackTrace();??
  • ????????}??
  • ??
  • ????}??

    ?

    ?

    当没有进行t0.stop()方法的调用时, 可以发现,两个线程争用锁的顺序是固定的。

    ?

    输出:

    thread->Thread-0 acquire lock.
    thread->Thread-0 release lock.
    thread->Thread-1 acquire lock.

    ?

    但调用了t0.stop()方法后,(去掉上面的注释//t0.stop();),可以发现,t0线程抛出了ThreadDeath error并且t0线程释放了它所占有的锁。

    ?

    输出:

    thread->Thread-0 acquire lock.
    thread->Thread-1 acquire lock.
    Caught in run: java.lang.ThreadDeath
    java.lang.ThreadDeath
    ?at java.lang.Thread.stop(Thread.java:715)
    ?at com.yezi.test.timeout.ThreadStopTest.main(ThreadStopTest.java:40)

    ?

    ?

    从上面的程序验证结果来看,thread.stop()确实是不安全的。它的不安全主要是针对于第二点:释放该线程所持有的所有的锁。一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在调用thread.stop()后导致了该线程所持有的所有锁的突然释放,那么被保护数据就有可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。

    ?

    ?

    ?

    如何正确停止线程

    关于如何正确停止线程,这篇文章(how to stop thread)给出了一个很好的答案, 总结起来就下面3点(在停止线程时):

    1. 使用violate boolean变量来标识线程是否停止

    2. 停止线程时,需要调用停止线程的interrupt()方法,因为线程有可能在wait()或sleep(), 提高停止线程的即时性

    3. 对于blocking IO的处理,尽量使用InterruptibleChannel来代替blocking IO

  • 热点排行