线程中断

Posted icarus-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程中断相关的知识,希望对你有一定的参考价值。

--  当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务。Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制。

--  一个线程不应该由其他线程来强制停止,而是应该由该线程自己自行停止。所以Thread.stop,Thread.suspend,Thread.resume都已经被废弃了。

--  Thread.interrupt()的作用其实也不是中断某一个线程,而是通知某一个线程你该中断了。具体到底中断还是继续运行,应该由被通知的线程自己处理。具体来说,当对一个线程调用interrupt()方法时:

  1、如果线程正处于阻塞状态(例如sleep,wait,join等状态),那么线程将立即退出阻塞状态,并抛出一个InterruptedException异常,同时清除中断标志。仅此而已。

  2、如果线程正处于正常运行状态,那么会将该线程的中断标志设置为true,仅此而已。被设置中断标志的线程将继续正常运行,不受任何影响。

--  如果一个线程有需要被中断的需求时:

  1、在正常运行任务时,while()循环经常检验本线程的中断标志位,如果被设置了中断标志就自行停止线程。

  2、在调用阻塞方法时,正确处理InterruptedException异常(catch异常之后,结束当前线程,并选择是否向上抛出该异常)

--  java.lang.Thread类提供了如下方法来操作中断

  1、public static boolean interrupted():测试当前线程是否已经中断,同时清除中断标志。(即如果连续两次调用该方法,则第二次调用将返回false)

  2、public boolean isInterrupted():测试当前线程是否已经中断,但不清除中断标志。

  3、public void interrupt():中断某一线程。

  注意,interrupt()方法是唯一能将中断状态设置为true的方法。静态方法interrupted()会将当前线程的中断状态清除。

--  java.lang.Thread类下的stop()方法被废弃

  1、调用stop()方法会立刻停止run()方法中剩余的全部工作,包括在catch或finally语句中的,并抛出ThreadDeath异常。可能导致一些清理性工作得不到完成,如文件,数据库等的关闭。

  2、调用stop()方法会立即释放该线程所持有的锁,导致数据得不到同步,出现数据一致性问题。

 

(原文参考:https://www.jianshu.com/p/48b81410300a)

(原文参考:https://www.cnblogs.com/jinggod/p/8486096.html

(原文参考:https://www.cnblogs.com/liyutian/p/10196044.html)

以上是关于线程中断的主要内容,如果未能解决你的问题,请参考以下文章

线程中断方法

中断线程

Thread的中断机制(interrupt),循环线程停止的方法

线程中断

线程中断以及线程中断引发的那些问题

中断了吗?interruptinterrupted isInterrupted 区别