浅析java线程中断的办法


Posted in Javascript onJuly 29, 2018

中断线程相关的方法

中断线程有一些相应的方法,这里列出来一下。

注意,如果是Thread.method(),则代表是静态方法。如果是thread.method()则代表着是类方法

void thread.stop()

这个方法能中断正在运行的线程,但是已经不推荐使用了,在将来的版本或许弃用,因为强行中断运行中的线程,是不安全的。

void thread.interrupt()

如果正在运行wait(),sleep(),join()这三个方法阻塞了线程,那么将会使得线程抛出InterruptedException异常,这是一个中断阻塞的过程。如果是其它的正在运行的状态,那么将不会有任何影响,也不会中断线程,或者抛出异常,只会会打上一个中断线程的标志,是否中断线程,将由程序控制。

boolean thread.isInterrupted()

它会获取当前线程的标志,如果之前调用过thread.interrupt(),那么它的返回值是true。它的作用就是返回该线程是否有中断标志。多次调用这个方法的结果是一样的。

void Thread.interrupted()

与前面的方法不一样的是,这是一个静态方法,代表着不需要拿到线程对象就可以直接执行,所以它的作用是返回当前线程是否有中断标志。但是它的区别是,当调用这个方法之后,会清除程序的中断标志,就是如果当前线程已中断,第一次调用这个方法的返回值是true,第二次调用这个方法的返回值为false,因为调用方法时,会清除它的中断标志。

中断线程

for循环标记退出

package com.xiaojiezhu.thread;

/**
 * @author xiaojie.zhu
 */
public class ThreadBreak implements Runnable {

  @Override
  public void run() {
    for(int i = 0 ; i < 10000 ; i ++){
      boolean interruped = Thread.currentThread().isInterrupted();
      if(interruped){
        //有中断标记,中断
        break;
      }
      System.out.println(i);
    }

    System.out.println("over");
  }


  public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(new ThreadBreak());
    t.start();
    Thread.sleep(1);

    t.interrupt();
  }
}

打印结果如下

44
45
46
47
over

阻塞的退出线程

只要是在运行wait(),sleep(),join()的方法,它就会声明一个InterruptedException异常,也就是意味着这些方法并不是一定能执行完成,因为当调用线程的interrupt()方法时,就会中断这个阻塞的办法,从而进入到异常中,代码如下

package com.xiaojiezhu.thread;

/**
 * @author xiaojie.zhu
 */
public class ThreadBreak2 implements Runnable {
  @Override
  public void run() {
    try {
      Thread.sleep(20000);
      System.out.println("这段话不会输出");
    } catch (InterruptedException e) {
      //如果在sleep()的过程中调用了interrupt()方法,就会进入这里,因为会强行中断sleep()
      
      //这里打印出来的中断标记为false,因为只要进入了InterruptedException异常,中断标记就会被清除掉
      System.out.println("中断标记为:" + Thread.currentThread().isInterrupted());
      System.out.println("输出异常");
      e.printStackTrace();
    }
  }

  public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(new ThreadBreak2());
    t.start();

    Thread.sleep(100);

    t.interrupt();

    System.out.println("over");
  }
}

打印结果如下

over
中断标记为:false
输出异常
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.xiaojiezhu.thread.ThreadBreak2.run(ThreadBreak2.java:10)
at java.lang.Thread.run(Thread.java:748)

注意:因为只要进入了InterruptedException异常,中断标记就会被清除掉

这里会衍生出另一种情况,就是如果在进入阻塞方法之前,就有了中断标记呢?会发生什么,就如下的代码:

for(int i = 0 ; i < 10000 ; i ++){
  System.out.println(i);
}
try {
  System.out.println("开始sleep");
  Thread.sleep(20000);
  System.out.println("结束sleep");

} catch (InterruptedException e) {
  e.printStackTrace();
}

实际上它会先执行完上面的for循环,因为for循环中是无法中止的,在进入sleep()的时候,瞬间就抛出异常

完整的测试代码如下

package com.xiaojiezhu.thread;

/**
 * @author xiaojie.zhu
 */
public class ThreadBreak3 implements Runnable {

  @Override
  public void run() {
    for(int i = 0 ; i < 10000 ; i ++){
      System.out.println(i);
    }
    try {
      System.out.println("开始sleep");
      Thread.sleep(20000);
      System.out.println("结束sleep");

    } catch (InterruptedException e) {
      e.printStackTrace();
    }

  }

  public static void main(String[] args) {
    Thread thread = new Thread(new ThreadBreak3());
    thread.start();

    thread.interrupt();
  }
}

打印结果如下

9997
9998
9999
开始sleep
java.lang.InterruptedException: sleep interrupted
  at java.lang.Thread.sleep(Native Method)
  at com.xiaojiezhu.thread.ThreadBreak3.run(ThreadBreak3.java:15)
  at java.lang.Thread.run(Thread.java:748)

使用stop()方法停止线程

thread.stop()方法是一个不安全的方法,已经不推荐使用了,但是在目前的代码中,还能正常使用,我们不推荐这样使用,但是这里介绍一下

package com.xiaojiezhu.thread;

/**
 * @author xiaojie.zhu
 */
public class ThreadBreak4 implements Runnable {
  @Override
  public void run() {
    System.out.println("进入线程");
    try {
      Thread.sleep(20000);
      System.out.println("结束线程");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

  }

  public static void main(String[] args) {
    Thread t = new Thread(new ThreadBreak4());
    t.start();
    try {
      Thread.sleep(200);

      t.stop();

      System.out.println("over");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

打印结果如下

进入线程
over

Javascript 相关文章推荐
JavaScript语言中的Literal Syntax特性分析
Mar 08 Javascript
JS Date函数整理方便使用
Oct 23 Javascript
javascript根据时间生成m位随机数最大13位
Oct 30 Javascript
jQuery读取XML文件内容的方法
Mar 09 Javascript
全面了解addEventListener和on的区别
Jul 14 Javascript
Bootstrap基本样式学习笔记之标签(5)
Dec 07 Javascript
本地搭建微信小程序服务器的实现方法
Oct 27 Javascript
详解Vue.js项目API、Router配置拆分实践
Mar 16 Javascript
Puppeteer 爬取动态生成的网页实战
Nov 14 Javascript
element form 校验数组每一项实例代码
Oct 10 Javascript
swiper实现异形轮播效果
Nov 28 Javascript
redux处理异步action解决方案
Mar 22 Javascript
还不懂递归?读完这篇文章保证你会懂
Jul 29 #Javascript
如何在js代码中消灭for循环实例详解
Jul 29 #Javascript
Vue-cli3项目配置Vue.config.js实战记录
Jul 29 #Javascript
vue权限路由实现的方法示例总结
Jul 29 #Javascript
JS高级技巧(简洁版)
Jul 29 #Javascript
js运算符的一些特殊用法
Jul 29 #Javascript
不得不知的ES6小技巧
Jul 28 #Javascript
You might like
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
linux实现php定时执行cron任务详解
2013/12/24 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
Python对列表排序的方法实例分析
2015/05/16 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
高级人员简历的自我评价分享
2013/11/03 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
大学生志愿者活动总结
2014/06/27 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
幼儿园教师求职信
2015/03/20 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
辣妈辣妹观后感
2015/06/10 职场文书
2015暑期社会实践通讯稿
2015/07/18 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技