Java线程中断
-
当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时… 都需要通过一个线程去取消另一个线程正在执行的任务。Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制。
-
一个线程不应该由其他线程来强制停止,而是应该由该线程自己自行停止。所以Thread.stop,Thread.suspend,Thread.resume都已经被废弃了。
-
Thread.interrupt()的作用其实也不是中断某一个线程,而是通知某一个线程你该中断了。具体到底中断还是继续运行,应该由被通知的线程自己处理。具体来说,当对一个线程调用interrupt()方法时:
- 如果线程正处于阻塞状态(例如sleep,wait,join等状态),那么线程将立即退出阻塞状态,并抛出一个InterruptedException异常,同时清除中断标志。仅此而已。
- 如果线程正处于正常运行状态,那么会将该线程的中断标志设置为true,仅此而已。被设置中断标志的线程将继续正常运行,不受任何影响。
-
如果一个线程有需要被中断的需求时:
- 在正常运行任务时,while()循环经常检验本线程的中断标志位,如果被设置了中断标志就自行停止线程。
- 在调用阻塞方法时,正确处理InterruptedException异常(catch异常之后,结束当前线程,并选择是否向上抛出该异常)
-
java.lang.Thread类提供了如下方法来操作中断
- public static boolean interrupted():测试当前线程是否已经中断,同时清除中断标志。(即如果连续两次调用该方法,则第二次调用将返回false)
- public boolean isInterrupted():测试当前线程是否已经中断,但不清除中断标志。
- public void interrupt():中断某一线程。
注意,interrupt()方法是唯一能将中断状态设置为true的方法。静态方法interrupted()会将当前线程的中断状态清除。
-
java.lang.Thread类下的stop()方法被废弃
- 调用stop()方法会立即停止run()方法中剩余的全部工作,包括在catch或finally语句中的,并抛出ThreadDeath异常。可能导致一些清理性工作得不到完成,如文件,数据库等的关闭。
- 调用stop()方法会立即释放该线程所持有的锁,导致数据得不到同步,出现数据一致性问题。
评论