目录

一、引言

二、stop与interrupt

三、非阻塞线程被interrupt

四、阻塞线程被interrupt

五、总结


一、引言

线程中断在开始没有特别重视,多线程往后学习才发现线程中断也是件比较有技巧的事情,停止线程不像break语句中那样简单,什么时候停止,停止后代码是否执行,如何捕捉线程异常都是我们需要学习的内容。

正常情况下我们停止线程有三种方法

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后才停止;

  2. 就是我们上面所说的使用stop方法强行终止线程,是过期作废的方法,这种方法可以排除不用;

  3. 使用interrupt方法终止线程。

第一种比较常见这里建议使用第三种也重点讲第三种,以及为什么在第二种和第三种选择了第二种。

二、stop与interrupt

stop方法比较强势,直接把所用的停止,但是因为威力太强大所以我们不建议使用,举个例子

public class Testinterrupt {public  static  void main(String [] args) {Thread thread= new Thread(new Runnable() {public void run() {System.out.println(Thread.currentThread().getName()+"start");try {Thread.sleep(4000);} catch (InterruptedException e) {System.out.println("线程中止");//线程终止后报异常}System.out.println(Thread.currentThread().getName()+"end");}});System.out.println(Thread.currentThread().getName()+"start");thread.start();try {Thread.sleep(2000);//thread.interrupt();//中止线程报异常,如果使用stop(),子线程与后面的代码不会执行thread.stop();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"end");}
}

输出结果:(结果是子线程在stop后面的全部没有输出,连个异常都没抛,但是使用interrupt方法后面的代码可以继续执行)

mainstart
Thread-0start
mainend

三、非阻塞线程被interrupt

先上个例子

public class Test3 {public  static  void  main(String []args){final Thread thread1= new Thread(new Runnable() {public void run() {while (true){System.out.println(Thread.currentThread().getName()+"is running");if(Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName()+"interrupt,即将退出");//throw new InterruptedException();}//Thread.sleep(1000);//countDownLatch.countDown();}}});thread1.start();new Thread(new Runnable() {public void run() {
/*                try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}*/try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}thread1.interrupt();}}).start();}}

输出结果:

Thread-0is running
Thread-0is running
Thread-0is running
Thread-0is running
Thread-0interrupt,即将退出
Thread-0is running
Thread-0interrupt,即将退出
Thread-0is running
Thread-0interrupt,即将退出

打印出来了即将推出字眼说明子线程已经被interrupt掉,但是我们发现子线程没有停止,那中断有个毛线用处,要他有何用?

表着急,线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。

下面进行手动抛出异常

public class Test3 {public  static  void  main(String []args){final Thread thread1= new Thread(new Runnable() {public void run() {try {while (true){System.out.println(Thread.currentThread().getName()+"is running");if(Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName()+"interrupt,即将退出");throw new InterruptedException();}//countDownLatch.countDown();}} catch (InterruptedException e) {System.out.println("进入ExceptionInterrupt2 类中run方法的catch了!");e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"is ending");}});thread1.start();new Thread(new Runnable() {public void run() {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}thread1.interrupt();}}).start();}}

输出结果

Thread-0is running
Thread-0is running
Thread-0is running
Thread-0is running
Thread-0is running
Thread-0interrupt,即将退出
进入ExceptionInterrupt2 类中run方法的catch了!
java.lang.InterruptedExceptionat com.question.Test3$1.run(Test3.java:31)at java.lang.Thread.run(Thread.java:748)
Thread-0is ending

这次程序就在我们捕捉到异常的位置停止了

四、阻塞线程被interrupt

下面再写一个阻塞子线程被interrupt的例子

public class Test3 {public  static  void  main(String []args){final Thread thread1= new Thread(new Runnable() {public void run() {//for (int i=0;i<10;i++)try {while (true){System.out.println(Thread.currentThread().getName()+"is running");if(Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName()+"interrupt,即将退出");throw new InterruptedException();}Thread.sleep(1000);}} catch (InterruptedException e) {System.out.println("进入ExceptionInterrupt2 类中run方法的catch了!");e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"is ending");}});thread1.start();new Thread(new Runnable() {public void run() {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}//System.out.println("到达5个,结束线程");thread1.interrupt();//System.out.println("到达5个,结束线程");}}).start();//service.shutdown();}}

输出结果:

Thread-0is running
进入ExceptionInterrupt2 类中run方法的catch了!
java.lang.InterruptedException: sleep interruptedat java.lang.Thread.sleep(Native Method)at com.question.Test3$1.run(Test3.java:33)at java.lang.Thread.run(Thread.java:748)
Thread-0is ending

阻塞线程会自动抛出异常,有点类似上面我们写的第二个例子,因为捕捉到了异常所以不会继续执行。

当一个线程处于中断状态时,如果再由wait、sleep以及jion三个方法引起的阻塞,那么JVM会将线程的中断标志重新设置为false,并抛出一个InterruptedException异常,然后开发人员可以中断状态位“的本质作用-----就是程序员根据try-catch功能块捕捉jvm抛出的InterruptedException异常来做各种处理,比如如何退出线程。总之interrupt的作用就是需要用户自己监视线程状态isinterrupted并进行处理。

五、总结

  • stop与interrupt
  • 非阻塞线程interrupt(手动抛异常)
  • 阻塞线程interrupt

Java多线程(七)——线程中断相关推荐

  1. Java多线程之线程虚假唤醒

    Java多线程之线程虚假唤醒 本文目录提纲 问题:两个线程对一个初始值为零的变量操作,实现一个线程加一,另一个线程减一,来十次. 问题:四个线程对一个初始值为零的变量操作,实现两个线程加一,另外两个线 ...

  2. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  3. Java多线程与线程并发库高级应用笔记

    以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...

  4. Java多线程之线程同步机制(锁,线程池等等)

    Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...

  5. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  6. Java多线程之线程池配置合理线程数

    Java多线程之线程池配置合理线程数 目录 代码查看公司服务器或阿里云是几核的 合理线程数配置之CPU密集型 合理线程数配置之IO密集型 1. 代码查看公司服务器或阿里云是几核的 要合理配置线程数首先 ...

  7. Java多线程之线程池的手写改造和拒绝策略

    Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...

  8. Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

    Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...

  9. Java多线程之线程池详解

    Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...

  10. Java多线程之线程通信之生产者消费者阻塞队列版

    Java多线程之线程通信之生产者消费者传统版和阻塞队列版 目录 线程通信之生产者消费者传统版 线程通信之生产者消费者阻塞队列版 1. 线程通信之生产者消费者传统版 题目: 一个初始值为零的变量,两个线 ...

最新文章

  1. 腾讯云CentOS7.2+Django2.2+Python3.7+Nginx+Uwsgi 初学者部署教程
  2. 关于Android 8.0java.lang.SecurityException: Permission Denial错误的解决方法
  3. 利用svg技术实现在线动画演示
  4. 11.6 mpstat:CPU信息统计
  5. CF183D-T-shirtx【dp,贪心】
  6. 女士细线毛衣起多少针_从起针到缝合,教你织毛衣的各种要点(详细教程)
  7. matlab如何提高运算速速,如何提高以下程序的运算速度及有选择性的保存数据?...
  8. c语言中0xof423什么意思,C语言指针 百思不得其解的一个问题
  9. 【poj2096】Collecting Bugs 期望dp
  10. 用httpPost对JSON发送和接收的例子
  11. 所有锁的unlock要放到try{}finally{}里,不然发生异常返回就丢了unlock了
  12. 不用static,巧用对象.方法调用java中的函数
  13. 创建一个 scrapy 爬虫项目
  14. 【足迹C++primer】51、面向对象编程概述
  15. Keras中那些学习率衰减策略
  16. 在苹果Macbook Pro上安装Windows 7
  17. qconshanghai2015
  18. 男生说fb是什么梗_男生聊污是什么意思 男生会对谁聊污
  19. 建网站如何选择空间?
  20. 【CodeForces 574B】Bear and Three Musketeers

热门文章

  1. python读写文件函数_Python开发【第三篇】:函数读写文件
  2. 全国二级 mysql有用_2020年全国计算机二级MySQL复习知识点:调整服务器
  3. linux内核维护者,Linux 内核维护者封杀明尼苏达大学(转载) - 优秀的Free OS(Linux)版 - 北大未名BBS...
  4. 洛谷——P1146 硬币翻转
  5. 中如何设置电气栅格_游戏中的设置界面如何设计?
  6. Struct嵌套使用
  7. Unity ToLua 中Update的调用流程
  8. 4.2 js没有块级作用域
  9. RequestsLibrary库入门介绍
  10. [转]busybox登陆后没要求输入密码的解决办法