前几篇都介绍了Thread中的几个方法,相信大家都发现一个相似点,那就是sleep,join,wait这样的阻塞方法都必须捕获一个InterruptedException异常,顾名思义就是一个线程中断的异常,那什么是线程中断呢?线程中断会有哪些问题呢?这一篇我们就来介绍一下线程中断的概念:

在java的线程Thread类中有三个方法,比较容易混淆,在这里解释一下

(1)interrupt:置线程的中断状态

(2)isInterrupt:线程是否中断

(3)interrupted:返回线程的上次的中断状态,并清除中断状态



举个例子:

[java] view
plain
copy

  1. class MyThread extends Thread {
  2. ......
  3. ......
  4. public void run() {
  5. try {
  6. while(!Thread.currentThread().isInterrupted()) {  //如果线程没有被中断就继续运行
  7. //阻塞代码:sleep,wait等
  8. //当其他线程,调用此线程的interrupt()方法时,会给此线程设置一个中断标志
  9. //sleep,wait等方法会检测这个标志位,同时会抛出InterruptedException,并清除线程的中断标志
  10. //因此在异常段调用Thread.currentThread().isInterrupted()返回为false
  11. }
  12. } catch (InterruptedException e) {
  13. //由于阻塞库函数,如:Object.wait,Thread.sleep除了抛出异常外,还会清除线程中断状态,因此可能在这里要保留线程的中断状态
  14. Thread.currentThread().interrupt();//从新设置线程的中断标志
  15. }
  16. }
  17. public void cancel() {
  18. interrupt();  //中断线程
  19. }
  20. }

外部调用

[java] view
plain
copy

  1. MyThread thread = new MyThread();
  2. thread.start(); //开启线程
  3. ......
  4. thread.cancel();  //中断线程
  5. System.out.println(thread.isInterrupt)//打印线程中断标志

一般来说,阻塞函数,如:Thread.sleep、Thread.join、Object.wait等在检查到线程的中断状态时,会抛出InterruptedException,同时会清除线程的中断状态



对于InterruptedException的处理,可以有两种情况:

(1)外层代码可以处理这个异常,直接抛出这个异常即可

(2)如果不能抛出这个异常,比如在run()方法内,因为在得到这个异常的同时,线程的中断状态已经被清除了,需要保留线程的中断状态,则需要调用Thread.currentThread().interrupt()



另外,Thread.interrupted()在jdk库的源代码中比较常用,因为它既可以得到上一次线程的中断标志值,又可以同时清除线程的中断标志,一举两得,但同时也有坏处,就是这个函数有清除中断状态的副作用,不容易理解。

从上面的分析可以查出,通过中断机制也可以实现线程的终止,但是这种方式也是基于抛出异常的,所以这种方式也是不安全的,同时我们也可以这样理解就是中断机制就是来结束那些阻塞的线程的,因为阻塞线程回去检查中断标志位,又中断就抛异常来结束线程的运行。

通过这一篇貌似可以理解那些调用阻塞线程的方法为什么要抛出中断异常了,同时也理解了线程的中断机制。

好吧,又结束了一篇,但是这一篇不是最后一篇奥,千万不要放弃呀,后面还有呢!要继续关注呀!

Java中的线程Thread方法之---interrupt()的更多相关文章

  1. Java中的线程Thread方法之---suspend()和resume()

    前篇说到了Thread中的join方法,这一篇我们就来介绍一下suspend()和resume()方法,从字面意义上可以了解到这两个方法是一对的,suspend()方法就是将一个线程挂起(暂停),re ...

  2. Java中的线程Thread方法之---stop()

    搞过Java线程的人都知道,stop这个方法是臭名昭著了,早就被弃用了,但是现在任然有很多钟情与他的人,永远都放不下他,因为从他的字面意思上我们可以知道他貌似可以停止一个线程,这个需求是每个搞线程开发 ...

  3. Java中的线程Thread方法之---join()

    上一篇我们说到了Thread中的stop方法,这一篇我们再来看一下方法join的使用,那么方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. join方法从字面上的意 ...

  4. Java中的线程Thread总结

    首先来看一张图,下面这张图很清晰的说明了线程的状态与Thread中的各个方法之间的关系,很经典的! 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口. 要注意的是Threa ...

  5. Java中实现线程的方法

    Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 第一种:继承Thread类 new Thread(){}.start();这表示调 ...

  6. Java 中的线程 thread

    一.问:线程有哪些状态? new, runnable, running, waiting, dead 线程状态间的流转 二.问:线程实现方式? 实现 Runnable 接口,然后new Thread, ...

  7. 【Java中的线程】java.lang.Thread 类分析

    进程和线程 联想一下现实生活中的例子--烧开水,烧开水时是不是不需要在旁边守着,交给热水机完成,烧开水这段时间可以去干一点其他的事情,例如将衣服丢到洗衣机中洗衣服.这样开水烧完,衣服洗的也差不多了.这 ...

  8. JAVA中创建线程的三种方法及比较

    JAVA中创建线程的方式有三种,各有优缺点,具体如下: 一.继承Thread类来创建线程 1.创建一个任务类,继承Thread线程类,因为Thread类已经实现了Runnable接口,然后重写run( ...

  9. JAVA中创建线程池的五种方法及比较

    之前写过JAVA中创建线程的三种方法及比较.这次来说说线程池. JAVA中创建线程池主要有两类方法,一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用.另一类是通过Thr ...

随机推荐

  1. day10 python算法 冒泡算法 二分法 最快查找算法 c3算法

    day10 python       1.冒泡算法         冒泡排序,把列表竖起来看,就像一个个气泡往上去(时间复杂度大) lst = [12,3,3,2424,14,3567,534,324 ...

  2. 关于计算机学习的书(doc,mobi,epub,pdf四种格式)

    关于计算机学习的书(doc,mobi,epub,pdf四种格式) <html> <body> <div> 21天学通C+ +2016/6/22 18:47文條 30 ...

  3. Unity 调用jar闪退 解决方案

    { https://www.cnblogs.com/YZFHKMS-X/p/11864496.html }

  4. python自动化测试-使用第三方python库技术实现

    转载自https://www.cnblogs.com/beer/p/5418471.html

  5. ajax验证用户名是否存在,手机号是不是匹配

    <label class="col-sm-2 control-label font">用户名</label> <div class="col ...

  6. RMQ区间求最值

    RMQ用于区间快速查找最值,适用于期间数值无更改的情况.其预处理的复杂度为O(nlogn),查询的时间复杂度为O(1),对比于线段树的预处理O(nlogn),查询O(logn)来说,在某些情况下有着其 ...

  7. 127.0.0.1和localhost不能正确映射的问题

    可能引起的问题: 检查:分别ping一下127.0.0.1和localhost 以上是正确演示,不匹配的话,ping localhost会返回: 解决方案: 可能1: 在浏览器中打开http://12 ...

  8. Transactional事务管理操作

    Transactional的属性: alue String 可选的限定描述符,指定使用的事务管理器 propagation enum: Propagation 可选的事务传播行为设置 isolatio ...

  9. angulajs 详解 directive 中 的 scope 概念

    Directive 是 angularjs 中最重要的概念,我的理解就是自定义html tag, 这个自定的tag 浏览器不会解析,会有angularjs 来动态解析. 比如在html 中添加 < ...

  10. CSS:CSS 字体

    ylbtech-CSS:CSS 字体 1.返回顶部 1. CSS 字体 CSS字体属性定义字体,加粗,大小,文字样式. serif和sans-serif字体之间的区别  在计算机屏幕上,sans-se ...