A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 kongling 于 2013-12-5 18:58 编辑

Thread 的suspend()和stop()方法,都不建议用吗?为什么?

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

4 个回复

倒序浏览
1,关于不建议使用Thread  请参考
http://bbs.itheima.com/forum.php ... mp;page=1#pid571036
我的回答。
2,suspend()和stop()方法都是Thread中终止线程的的方法,其中区别是,stop终止所有未结束的方法,包括run方法,当一个线程停止时候,他会立即释放所有他锁住对象上的锁。这会导致对象处于不一致的状态,最经典的是银行账户取款存款问题上。当线程想终止另一个线程的时候,它无法知道何时调用stop是安全的,何时会导致对象被破坏,你应该中断一个线程而不是停止他,所以这个方法慎用。
suspend不会破坏对象,但你用一个suspend挂起一个有锁的线程,那么在锁恢复之前将不会被释放。如果调用suspend的方法线程试图取得相同的锁,就会出现死锁问题。而且suspend()方法和stop()方法都已过时。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
Thread.suspend 从本质上就是易于死锁的。如果目标线程锁定在一个监视程序上,从而在关键系统资源挂起时保护资源,则在目标线程恢复前将没有线程能访问该资源。如果试图恢复目标线程的线程在调用 resume 之前试图锁定该监视程序,即出现死锁。这种死锁通常将自己显示为“冻结”进程。
回复 使用道具 举报
Thread.stop 因为它本质上就是不安全的。停止线程会导致解锁它已锁定的所有监视程序(ThreadDeath 异常传播到栈上后即解锁监视程序)。如果这些监视程序前面保护的任何对象处于不一致状态,则其它线程即可能将这些对象视为处于不一致状态。我们将这种对象称为损坏的对象。当线程操作损坏的对象时,可能会产生任何意外的行为。这种行为可能很难觉察,也可能非常明显。与其它未检查的异常不同,ThreadDeath 将悄悄杀掉线程;这样,用户就不会得到其程序已被破坏的警告。这种破坏可能会在实际损坏发生之后的任何时间显示出来,甚至可能会在数小时或数天之后。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
视频里没有详细讲你这方法的应用,应该是开发不常见的,别纠结于不用的东西上面
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马