通常不会手动停止线程,会等任务执行完成自然停止。
直接暴力停止线程
java.lang.Thread#stop()
方法已标记为Deprecated
因为不安全、不合理,不了解对方的工作,不能粗暴停止。
通知、协作来停止
java.lang.Thread#interrupt
只能以中断通知来通知线程中断,被中断的线程通过检查中断标记位来决定是否停止工作
而工作线程中通过检查标记位的状态来判断是否继续进行工作
sleep期间能否感受到中断
能,如果sleep、wait等可以让线程进入阻塞的方法使线程休眠了,而处于休眠中的线程被中断,那么线程是可以感受到中断信号的,并且会抛出一个InterruptedException异常,同时清除中断信号,将中断标记位设置成false。
感受到InterruptedException后的最好的处理方式
总的原则就是不能屏蔽中断请求
- 方法签名抛异常交给上层处理
- 再次中断交给后续逻辑处理,比如如果在循环中,那么下次进入循环的条件不成立,任务结束
错误的停止线程的方式
- stop()方法任务戛然而止,可能产生数据完整性问题
- suspend()方法、resume()方法进入休眠不释放锁
- volatile标记位只能在代码执行到判断语句时才能感受标记位的变化,线程在阻塞的情况下无法感知volatile标记位的变化,从而无法及时做出响应