最近在系统回顾多线程这一部分的内容,对线程中断方式这一部分相比之前有了不同的认识。整理一下,如有理解偏颇之处,还请各位大神不惜赐教。

在看高洪岩《Java多线程编程核心技术》的时候里面讲了很多种停止线程方式,其实仔细回想起来停止线程并没有那么复杂。总体整理下来就三种方式!1、正常退出;2、stop暴力停止(不再推荐使用);3、异常法;

1、正常退出

当线程中run()或者call()按照逻辑流程正常的执行结束了,线程也就自然停止了。

2、stop暴力停止

直接在程序中使用thread.stop(),线程会马上停止,但是可能导致数据不同步,或者资源得不到回收的问题而且stop已经标注为作废方法,所以使用一定要慎重。

3、interrupt()异常法。

小编以前的博客写过《【多线程】——停止线程的三种方式》其中讲的是interrupt()和在沉睡中停止本质上讲这两种方式都是通过异常停止的,而且讲的不是很全面,应该是只要线程处于阻塞状态配合interrupt()都能使线程停止,而且停止的方式都是通过抛异常。

interrupt()方法仅仅是在当前线程中打了一个停止的标识将中断标志修改为true,并没有真正的停止线程。如果在此基础上进入堵塞状态(sleep(),wait(),join()),马上就会抛出一个InterruptedException,且中断标志被清除,重新设置为false,线程退出。所以退出线程的方式不仅仅是sleep()+interrupt()方法,其它的暂停线程的方式都可以。

package com.jia.thread;/*** @author 贾文静 on 2018/6/6.* Describe*/
public class InterruptService implements Runnable {//如果使用Callable接口中call方法异常就会得以扩散@Overridepublic void run() {try {System.out.println( "begin run" );//重要:无论是先中断还是先阻塞都能达到停止线程的目的,只要两者配置使用就可以到达效果Thread.currentThread().interrupt();//方式一,线程进入sleep
//            Thread.sleep( 10 );//方式二、join
//            Thread.currentThread().join();//方式三、wait
//            Thread.currentThread().wait();System.out.println( "begin end" );} catch (Exception e) {System.out.println("先interrupt再阻塞后终止了");e.printStackTrace();}}
}
package com.jia.thread;/*** @author 贾文静 on 2018/6/6.* Describe*/
public class SleepThread {public static void main(String[] args) throws InterruptedException {try {InterruptService interruptService = new InterruptService();Thread thread = new Thread(interruptService);thread.start();Thread.sleep(2000);} catch (Exception e) {e.printStackTrace();}}
}

interrupt简述

interrupt()方法只是改变中断状态,不会中断一个正在运行的线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程检查到中断标识,就得以退出阻塞的状态。

更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常),从而提早地终结被阻塞状态。如果线程没有被阻塞,这时调用 interrupt()将不起作用,直到执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException。

this.interrupted()

测试当前线程是否已经中断(静态方法)。返回的是上一次的中断状态,并且会清除该状态,所以连续调用两次,第一次返回true,第二次返回false。

this.isInterrupted()

测试线程当前是否已经中断,但是不能清除状态标识。

总结

再次总结线程的停止方式,将线程停止方式归纳一下,就三种方式,理解清楚了其实也不是很复杂。

【多线程】——深入理解线程中断方式(interrupt)相关推荐

  1. 关于线程中断thread interrupt

    关于线程中断thread interrupt 在多线程编程中经常会遇到需要中止线程的情况,比如启动多个线程去数据库中搜索,如果有一个线程返回了结果,其他线程就可以取消了(Thread.stop()已经 ...

  2. 线程中断:interrupt、interrupted、isInterrupted

    Java中的线程: 提示:我们应该都知道在Java中通过Thread类来实现多线程的操作,但实际上线程是操作系统的最小执行单元,java中的Thread实例实际是与操作系统中线程做了一个映射,即一个T ...

  3. Java多线程学习(二)---线程创建方式

    线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...

  4. Qt 多线程基础及线程使用方式

    文章目录 Qt 多线程操作 2.线程类QThread 3.多线程使用:方式一 4.多线程使用:方式二 5.Qt 线程池的使用 Qt 多线程操作 应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一 ...

  5. 【Java并发编程】之二:线程中断

    [Java并发编程]之二:线程中断 使用interrupt()中断线程 ​ 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一 ...

  6. Java多线程(九)—— interrupt()和线程终止方式

    一.interrupt() 说明 interrupt()的作用是中断本线程. 本线程中断自己是被允许的:其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限.这有 ...

  7. java 线程池 中断_如何中断(interrupt)线程(thread)(线程池的线程中断我的理解是一个意思)...

    1.概述基本实现是,通过 InterruptedException 异常来终止程序,至于线程什么时候终止,只能由jvm来决定了,若理解的不到位,欢迎大牛们指点 2.code 如下 package co ...

  8. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括: 1. interrupt()说明 2. 终止线程的方式   2.1 终止处于"阻塞状态"的线 ...

  9. interupt java_Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 1. interrupt()说明 在介绍终止线程的方式之前,有必要先对interrupt()进行了解. Interrupts this thread. Unless the current th ...

最新文章

  1. 阿里代码规范插件 中文使用手册 FOR Eclipse
  2. mysql备份时候事务日志_SQLSERVER备份事务日志的作用
  3. c语言作业答案N个公约数公倍数,c语言程序题,输入两个正整数m和n,求其最大公约数和最小公倍数。...
  4. PC端和移动APP端CSS样式初始化
  5. 避免许多if块进行验证检查
  6. 诗与远方:无题(八十二)- 遇到你真好
  7. Socket套接字实现服务器端连接
  8. C# 抗变与协变的理解
  9. 微商人赚钱的4个关键点
  10. 一文带你弄懂 Java 动态代理 | 原力计划
  11. 个人博客开发系列:前台博客页面开发部署完成
  12. 1、selenium下载安装教程及环境变量配置
  13. Hive面试题汇总大全
  14. 浅谈Struts2拦截器的原理与实现
  15. 【软件设计】六大设计原则讲解
  16. boost any 操作
  17. 蓝桥杯-阶乘运算和高精度加法(Java)
  18. 客快物流大数据项目(三十九):Hue安装
  19. C语言实现随机点名器
  20. 期权的隐含波动率—python方法求解

热门文章

  1. sqlserver2019安装注意事项-最后一步机器学习无法验证通过,机器学习python
  2. 音频分析之——时域转频域
  3. IE兼容性问题汇总【持续更新中】
  4. js获取指定日期的前一年(需要判断闰年和平年)
  5. html 修改下拉框样式,select下拉框option的样式修改
  6. 计算抽象:可计算理论、模型与计算机
  7. 安装saltstack遇到缺包问题!自己遇到的错!若有雷同请海涵
  8. TPS5430DDAR型号芯片的学习
  9. 什么是线性表?什么是线性表的顺序存储结构?什么是线性表的链式存储结构?
  10. C语言图形函数...