Java线程之中,一个线程的生命周期分为:初始、就绪、运行、阻塞以及结束。当然,其中也可以有四种状态,初始、就绪、运行以及结束。

一般而言,可能有三种原因引起阻塞:等待阻塞、同步阻塞以及其他阻塞(睡眠、jion或者IO阻塞);对于Java而言,等待阻塞是调用wait方法产生的,同步阻塞则是由同步块(synchronized)产生的,睡眠阻塞是由sleep产生的,jion阻塞是由jion方法产生的。

言归正传,要中断一个Java线程,可调用线程类(Thread)对象的实例方法:interrupte();然而interrupte()方法并不会立即执行中断操作;具体而言,这个方法只会给线程设置一个为true的中断标志(中断标志只是一个布尔类型的变量),而设置之后,则根据线程当前的状态进行不同的后续操作。如果,线程的当前状态处于非阻塞状态,那么仅仅是线程的中断标志被修改为true而已;如果线程的当前状态处于阻塞状态,那么在将中断标志设置为true后,还会有如下三种情况之一的操作:

  • 如果是wait、sleep以及jion三个方法引起的阻塞,那么会将线程的中断标志重新设置为false,并抛出一个InterruptedException;
  • 如果是java.nio.channels.InterruptibleChannel进行的io操作引起的阻塞,则会对线程抛出一个ClosedByInterruptedException;(待验证)
  • 如果是轮询(java.nio.channels.Selectors)引起的线程阻塞,则立即返回,不会抛出异常。(待验证)
如果在中断时,线程正处于非阻塞状态,则将中断标志修改为true,而在此基础上,一旦进入阻塞状态,则按照阻塞状态的情况来进行处理;例如,一个线程在运行状态中,其中断标志被设置为true,则此后,一旦线程调用了wait、jion、sleep方法中的一种,立马抛出一个InterruptedException,且中断标志被清除,重新设置为false。
通过上面的分析,我们可以总结,调用线程类的interrupted方法,其本质只是设置该线程的中断标志,将中断标志设置为true,并根据线程状态决定是否抛出异常。因此,通过interrupted方法真正实现线程的中断原理是:开发人员根据中断标志的具体值,来决定如何退出线程。
一个简单的实现方式如下:
public void run() {  try {  while (true){  Thread.sleep(1000l);//阻塞状态,线程被调用了interrupte()方法,清除中断标志,抛出InterruptedException  //dosomething  boolean isIn = this.isInterrupted();  //运行状态,线程被调用了interrupte()方法,中断标志被设置为true  //非阻塞状态中进行中断线程操作  if(isInterrupted()) break;//退出循环,中断进程
        }  }catch (InterruptedException e){//阻塞状态中进行中断线程操作  boolean isIn = this.isInterrupted();//退出阻塞状态,且中断标志被清除,重新设置为false,所以此处的isIn为false  return;//退出run方法,中断进程
    }
}

分别考虑了阻塞状态中进行中断线程和非阻塞状态中中断线程的处理方式。
最后,说明一下interrupte方法的调用,该方法可在需要中断的线程本身中调用,也可在其他线程中调用需要中断的线程对象的该方法。

转载于:https://www.cnblogs.com/rinack/p/7890181.html

Java线程中断理解(interrupte)相关推荐

  1. java线程——中断线程+线程状态+线程属性(优先级)

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程--中断线程+线程状态+线程属性(优先级) 的相关知识: [1]中断线程 1.1 ...

  2. java吵醒线程_一文搞懂 Java 线程中断

    在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分 ...

  3. 一文搞懂 Java 线程中断

    转载自   一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...

  4. java sleep方法_一文搞懂 Java 线程中断!

    在之前的一文<如何"优雅"地终止一个线程>详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程的方法吗?答案是肯定的,它就是我们今天要分享 ...

  5. java中断runnable_详解Java 线程中断

    一.前言 大家肯定都使用过 Java 线程开发(Thread / Runnable),启动一个线程的做法通常是: new Thread(new Runnable( @Override public v ...

  6. java 线程中断(转)

    程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误.       在本篇文章中,我们针对这些难题之一:如何中断一个正在运 ...

  7. java线程中断和终止线程运行

    ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程 ...

  8. java 线程 中断标志位

    课程素材来自 http://enjoy.ke.qq.com/    版权所有 java线程中,线程中断方法详解: 线程自然终止:自然执行完或抛出未处理异常 stop(),resume(),suspen ...

  9. Java线程池理解及用法

    前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...

  10. 进程、lwp(轻量级进程)和Java线程的理解

    进程:操作系统调度单元,数据结构为task_struck结构体,并且操作系统会为其分配资源(内存地址空间.打开的文件.挂起的信号.进程状态等).所以进程是处于执行期的程序以及它所管理的资源的总称. l ...

最新文章

  1. Python协方差矩阵处理脑电数据
  2. netbios 网上基本输入输出系统 简介
  3. seq2seq编码器和解码器:TensorFlow实现
  4. 博客从“新浪云“迁移到CSDN的说明
  5. nginx 上传文件漏洞_nginx爆惊天漏洞 上传图片就能入侵服务器
  6. (转)CXF学习笔记一:如何创建、发布和访问基于CXF的服务
  7. ElasticSearch搜索引擎:常用的存储mapping配置项 与 doc_values详细介绍
  8. Excel 2016双击无法打开文件的解决办法
  9. 干货分享:如何使用Kubernetes的Ingress API
  10. php异步发送邮件,php通过fsockopen异步发送邮件
  11. Git pull 强制覆盖本地文件
  12. 怎样做网站,需要考虑的几个seo因素
  13. 【开源打印组件】vue-plugin-hiprint初体验
  14. android虚拟摇杆
  15. 服务器 '' 上的 MSDTC 不可用。
  16. linux系统视屏录像_在Linux上的点击,弹出和故障排除录像
  17. java多线程listview_Android_listview分页加载更多
  18. macOS 安装postman 中文语言包
  19. 剑桥A1-C2单词表-01
  20. 社招和校招有什么不同?阿里美团等大厂 JAVA 社招面经分享

热门文章

  1. Vue cli 入门补充
  2. linux ftp命令参数全集
  3. word 与 endnote 反应慢的小技巧
  4. 源码nginx+php
  5. OpenGL学习笔记2 —— 画立方体
  6. cisco3745做Easy ×××
  7. 转载,对于已用encryption加密的存储过程,的解密方法
  8. GET 和 POST请求的本质区别是什么?看完觉得自己太无知了...
  9. 干掉 SQL 中的 like,我用 es 后运营小姐姐们都说好快!
  10. B站游戏大佬飘了?深挖B站辱北邮事件经过:不是第一次