黑马程序员技术交流社区
标题:
为什么弃用stop()和suspend()方法
[打印本页]
作者:
Bad_Boy
时间:
2013-9-14 12:07
标题:
为什么弃用stop()和suspend()方法
本帖最后由 Bad_Boy 于 2013-9-14 12:19 编辑
初始的java版本定义了一个stop方法来终止一个线程,suspend方法用来阻塞一个线程,为什么从java1.2就弃用了
作者:
yanglfree
时间:
2013-9-14 12:08
stop():该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。
suspend() :该方法已经遭到反对,因为它具有固有的死锁倾向。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前任何线程都不能访问该资源。如果重新开始目标线程的线程想在调用 resume 之前锁定该监视器,则会发生死锁。这类死锁通常会证明自己是“冻结”的进程。
作者:
yanglfree
时间:
2013-9-14 12:09
这个是API文档里面的权威解释。
作者:
Yuan先生
时间:
2013-9-14 12:54
stop这个方法将终止所有未结束的方法,包括run方法。当用stop停止一个线程的时候,就会立即释放当前对象上所有的锁。这会导致对象处于不一致的状态。假如在将钱从一个账户转移到另一个账户时,线程在取款之后存款之前就停止了。那么现在银行对象就被破坏了,当线程想终止另一个线程的时候,它无法知道何时调用stop是安全的,何时会导致对象被破坏。所以这个方法被弃用了。你应该中断一个线程而不是停止。
suspend不会破坏对象。但是,如果你用一个suspend挂起一个有锁的线程,那么在锁恢复之前将不会被释放。如果调用suspend的方法线程试图取得相同的锁,程序就会死锁。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2