java中线程的中断与终止

java中线程的中断与终止

1、interrupt()、isInterrupted()、interrupted()的作用

中断就是线程的一个标识位,它表示一个运行中的线程是否被其他线程调用了中断操作,其他线程可以通过调用线程的interrupt()方法对其进行中断操作,线程可以通过调用isInterrupted()方法判断是否被中断,线程也可以通过调用Thread的interrupted()静态方法对当前线程的中断标识位进行复位。

相关视频教程推荐:java在线视频

注意:不要认为调用了线程的interrupt()方法,该线程就会停止,它只是做了一个标志位。

如下:

可以看到当你调用了线程的interrupt()方法后,此时调用isInterrupted()方法会返回true,但是该线程还是会继续执行下去。所以怎么样才能终止一个线程的运行呢?

2、终止线程的运行

一个线程正常执行完run方法之后会自动结束,如果在运行过程中发生异常也会提前结束;所以利用这两种情况,我们还可以通过以下三种种方式安全的终止运行中的线程:

2.1、利用中断标志位

前面讲到的中断操作就可以用来取消线程任务,如下:

当不需要运行InterruptThread线程时,通过调用InterruptThread.interrupt()使得isInterrupted()返回true,就可以让线程退出循环,正常执行完毕之后自动结束。

2.2、利用一个boolean变量

利用一个boolean变量和上述方法同理,如下:

当不需要运行InterruptThread线程时,通过调用InterruptThread.cancel()使isCancel等于true,就可以让线程退出循环,正常执行完毕之后自动结束,这里要注意boolean变量要用volatile修饰保证内存的可见性。

2.3、响应InterruptedException

通过调用一个线程的 interrupt() 来中断该线程时,如果该线程处于阻塞、限期等待或者无限期等待状态,那么就会抛出 InterruptedException,从而提前结束该线程,例如当你调用Thread.sleep()方法时,通常会让你捕获一个InterruptedException异常,如下:

当不需要运行InterruptThread线程时,通过调用InterruptThread.interrupt()使得 Thread.sleep() 抛出InterruptedException,就可以让线程退出循环,提前结束。在抛出InterruptedException异常之前,JVM会把中断标识位复位,此时调用线程的isInterrupted()方法将会返回false。

java相关文章教程推荐:java编程入门

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容