使Thread中断的方式有很多种,比如调用stop()方法进行中断,但stop()方法存在线程的安全性问题,java api已经不推荐使用,那么我们想要让一个线程停止,我们可以使用java里面的interrupt机制。

在本线程,或其他线程里面可以调用具体线程的interrupt()方法,调用时是这样的,被打断的线程不会立刻被打断,只是他里面的一个状态被改变,然后靠线程自己去打断自己,即线程打断是自我打断,打断一个线程的时候,被中断线程可以通过interrupted()对状态进行检测,如果是被中断状态时,返回true,然后注意,此时的中断状态会被重置到未被打断状态,因此,被中断线程可以通过调用一次该值不做任何处理,让自己不被中断。而isInterrupted()方法不会重置清除状态。在另外的线程调用一个正在sleep(),或者wait()的线程的interrupt方法时,此时被中断线程会抛出一个错误,说明在休眠的线程中断是会被通知的,且此时的中断状态为false,也就是说中断休眠的线程是不会成功的。

我们通过下面一个例子来认识上述讲的那些点,main主线程会睡眠五秒后打断它自己的一个子线

public class ThreadInterrupt extends Thread{@Overridepublic void run() {while(true){System.out.println("线程运行中...");System.out.println("线程是否被打断:"+this.isInterrupted());System.out.println("线程确认是否被打断:"+this.isInterrupted());System.out.println("---------------------");try {Thread.sleep(1000);} catch (InterruptedException e) {System.out.println("捕获中断异常");if(Thread.interrupted()){//判断是否被中断System.out.println("线程在休眠中被中断");System.out.println("Thread.interupted():"+Thread.interrupted());break;}else{this.interrupt();System.out.println("线程并没有被中断");System.out.println("线程自己调用自己的中断方法");System.out.println("线程是否被打断:"+this.isInterrupted());System.out.println("线程确认是否被打断:"+this.isInterrupted());}}if(Thread.interrupted()){//判断是否被中断System.out.println("线程被中断");System.out.println("Thread.interupted():"+Thread.interrupted());break;}}}public static void main(String[] args) throws InterruptedException{Thread thread = new ThreadInterrupt();thread.start();Thread.sleep(5000);thread.interrupt();}
}
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:true
线程确认是否被打断:true
---------------------
捕获中断异常
线程并没有被中断
线程自己调用自己的中断方法
线程是否被打断:true
线程确认是否被打断:true
线程被中断
Thread.interupted():false

以上例子论证了线程在休眠中被中断的问题,运行上面例子的时候可能会出现另外一个结果,就是刚刚好子线程动的时候就被主线程打断了,那么将会出现下面的结果:

线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:true
线程确认是否被打断:true
---------------------
线程被中断
Thread.interupted():false

一心多用多线程-Thread的interrupt机制相关推荐

  1. 一心多用多线程-Thread的api探险

    1.首先谈一谈Thread的构造方法 Thread() 分配新的 Thread 对象. Thread(Runnable target) 分配新的 Thread 对象. Thread(Runnable ...

  2. 一心多用多线程-线程池ThreadPoolExecutor-看这篇就够了

    许久之前理解了java线程池ThreadPoolExecutor,今天来做一个总结,根据java api加上自己的理解,让我们能更透彻的理解java线程池 首先先写一下线程池的概念: 线程池:线程池是 ...

  3. 一心多用多线程-线程创建的三种方式

    第一次了解java线程机制,记录一下线程启动的三种方式. 1.通过继承Thread类调用一个线程 public class Thread1 extends Thread{@Overridepublic ...

  4. 一心多用多线程-阻塞队列(5)-CountDownLatch

    五.倒数执行机制-CountDownLatch Latch:门闩的意思.根据该类名的意思,我们就可以知道该类在多线中扮演的就是一个倒数门闩的角色,怎么理解呢? 首先呢,我们新建一个CountDownL ...

  5. 一心多用多线程-阻塞队列(7)-CyclicBarrier

    七.都做好了了就一起执行-CyclicBarrier 在文章(6)中我们谈到一个现象,就是做一道菜有时候是会分出多个工序进行的,当每个工序做好了之后那到菜才能相应的被做出来.文章(6)使用的是Coun ...

  6. 一心多用多线程-线程的生命周期

    想起前段时间做校招的时候经常会被问到线程的生命周期问题,现在结合api做一下归纳 1.新建状态 new Thread() 创建一个线程,现在的线程并没有具备运动能力的,可以想象你新建了一只兔子,但是这 ...

  7. 一心多用多线程-细谈java线程池submit与execute的区别

    深夜学习,发现ThreadPoolExecutor里面一个小知识点,故开热点连wifi怒写submit与execute方法的区别. 1.问题的来源 在看书的时候,涉及到java线程池问题的时候常常面临 ...

  8. 一心多用多线程-future-java线程中的异步执行

    经历了一波校招,实习,回到学校了,宿舍没网懒得来实验室也导致自己少写了几篇自己总结的技术博客. 现在来讲讲这两天了解到的java线程中future模式. 在web开发中,我们在静态网页中使用ajax可 ...

  9. android串口补位,Rust多线程中的消息传递机制

    代码说话. use std::thread; use std::sync::mpsc; use std::time::Duration; fn main() { let (tx, rx) = mpsc ...

最新文章

  1. R语言可视化面积图(area chart)移除轴标签与实际图形之间的空白区域实战:默认的面积图、移除轴标签与实际图形之间的空白区域
  2. Python学习笔记:Web后端开发一览
  3. CTFshow php特性 web95
  4. Spring-国际化信息03-容器级的国际化信息资源
  5. Vmware 没有vmnet8虚拟网卡、解决方法就是:刷机
  6. 5-输入输出系统IO
  7. java怎么访问私有类_如何从Java类的外部访问类的私有方法?
  8. 如何利用URLOS和云存储打造一个不惧怕宕机的网站环境
  9. 转载:8个让程序员追悔莫及的职业建议
  10. 转:python命令行解析工具Argparse
  11. php_2017手册,PHP中文手册下载-PHP中文手册官方2017(带用户注释)chm版-东坡下载
  12. 二叉树前中后序遍历的口诀
  13. 数据分析软件及spss简单操作
  14. Origin下载安装教程(亲测有用)
  15. windows server 2012 AD 活动目录部署系列(二)创建域控制器
  16. 延边大学计算机考研专业课考什么,延边大学2021小学教育经验贴
  17. 大数据管理技术 Hadoop-JavaAPI程序案例1
  18. 读书笔记:软件工程(11) - 传统方法学 - 软件需求分析
  19. configure报错
  20. MES系统到底是什么?

热门文章

  1. PHP-深入理解Opcode
  2. 强化学习中的马尔可夫决策过程
  3. ndarray 与 array 的区别 关系
  4. 机器学习----Softmax回归
  5. Java中violate关键字详解
  6. 程序员思维修炼:如何从新手成为专家
  7. Galera Cluster For MySQL
  8. Spring SpringBoot中使用Mybatis-plusDemo1
  9. 【程序设计】浅拷贝与深拷贝
  10. SCT2280FPAR,可以P2P参数MP8756