浅析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框架(Javascript Framework)
Nov 22 Javascript
javascript放大镜效果的简单实现
Dec 09 Javascript
ExtJS4 表格的嵌套 rowExpander应用
May 02 Javascript
jQuery新的事件绑定机制on()示例应用
Jul 18 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
Dec 26 Javascript
javascript使用 concat 方法对数组进行合并的方法
Sep 08 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
Oct 12 Javascript
解决bootstrap-select 动态加载数据不显示的问题
Aug 10 Javascript
基于layPage插件实现两种分页方式浅析
Jul 27 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
Nov 09 Javascript
vue excel上传预览和table内容下载到excel文件中
Dec 10 Javascript
jQuery HTML获取内容和属性操作实例分析
May 20 jQuery
还不懂递归?读完这篇文章保证你会懂
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
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
php生成zip文件类实例
2015/04/07 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
Python偏函数实现原理及应用
2020/11/20 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
python中random模块详解
2021/03/01 Python
CSS3实现可关闭的下拉手风琴菜单效果
2015/08/31 HTML / CSS
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
工商企业管理实习自我鉴定
2013/12/04 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
病危通知书样本
2015/04/17 职场文书
python - asyncio异步编程
2021/04/06 Python
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS