持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
stop方法
stop方法的作用是强制停止线程执行,如果该线程与当前线程不同,当前线程尝试去停止除自身以外的线程,那么安全管理者会调用checkPermission方法可能会抛出一个SecurityException异常停止尚未启动的线程,如果线程最终启动,即会被立即终止。应用程序通常不能尝试去捕获ThreadDeath异常,除非它必须执行一些特殊的清除操作。
注意点:ThreadDeath异常会导致finally代码块,try代码块在线程死亡前执行,如果catch代码块捕获到了ThreadDeath异常,必须抛出ThreadDeath异常,以便线程最终能够死亡。
stop方法本质上是不安全的,使用线程停止线程,stop方法会释放它已经上锁的资源,之前由这个监控器保护的其他对象会处于不一致的状态,导致对象对其他线程来说变为可见。stop方法应该只是替换一些变量,表明指定的线程已经停止,目标线程应该定期检验这些变量,如果这些变量表明可以停止线程,则以有序的方式从它的运行方法中返回,如果目标线程需要等待很长的时间,则调用interrupt方法中断等待。
@Deprecated
public final void stop(){
//获取SecurityManager
SecurityManager manager=System.getSecurityManager();
if(manager != null){
checkAccess();
if(this != Thread.currentThread){
manager.checkPermission(SecurityConstants.STOP_THREAD_PERMISSION);
}
//唤醒未被启动的线程
if(threadStatus != 0){
resume();
}
//处理所有状态的线程,线程立即停止,并抛出ThreadDeath异常
stop0(new ThreadDeath());
}
}
destory方法
destory方法是最初设计用来在没有任何清除的情况下销毁线程,它持有的所有显示器已经上锁,但是这个方法没有被实现,如果该方法被实现,则会发生死锁,如果目标线程被销毁时持有关键资源的锁,那么其他线程都无法再次访问该资源;如果另一个线程一直尝试获取资源,就会发生死锁,这种死锁通常表现为冻结进程,抛出一个NoSuchMethodError异常。
@Deprecated
public void destory(){
throw new NoSuchMethodError();
}