java中断机制实例讲解

 更新时间:2021年01月04日 17:25:56   作者:程序员陈浩  
这篇文章主要介绍了java中断机制实例讲解,用了风趣幽默的讲法,有对这方面不太懂的同学可以研究下

一、导言

线程A对线程B发出建议: 你好,可以停止了哟~

在实际生产环境中,对于阻塞任务,可能存在一些情况导致阻塞任务取消、终止,例如: 计时器到期,I/O 完成,或者另一个线程的动作(释放一个锁,设置一个标志,或者将一个任务放在一个工作队列中)。这种情况下可以使用java的中断机制来进行线程间通信。

java线程中断的实现是基于一个称为中断状态的内部标志位来实现的,其中断的含义更像是建议,一个线程如何响应另一个线程的中断完全取决于程序员: 继续向上抛出、封装后抛出、中断状态复原、忽略等。java库中的许多抛出 InterruptedException 的方法(例如 sleep)都被设计为取消当前操作并在接收到中断时立即返回。

InterruptException异常就像是一个声明,声明抛出该异常的方法都可被中断,比如wait、sleep、join。异常都是由可中断方法自己抛出来的,并不是直接由interrupt()方法直接引起的。一般来说,任何通过抛出一个 InterruptedException 来退出的方法都应该清除中断状态。

二、java 中断api

interrupt()

interrupt()方法本质上就是通过调用java.lang.Thread#interrupt0设置中断flag为true,如下代码演示了该方法的使用: 另启一个线程中断了当前线程。

@Test
public void interruptSt() {
 Thread mainThread = Thread.currentThread();
 new Thread(/*将当前线程中断*/mainThread::interrupt).start();
 try {
 //public static native void sleep(long millis) throws InterruptedException;
 Thread.sleep(1_000);
 } catch (InterruptedException e) {
 System.out.println("main 线程被中断了");
 }
 /*
 * 输出: main 线程被中断了
 */
}

interrupted()和isInterrupted()

public boolean isInterrupted() {
 // 设置this线程的中断flag,不会重置中断flag为true
 return isInterrupted(false);
}
public /*静态方法*/static boolean interrupted() {
 // 设置当前线程的中断flag,重置中断flag为true
 return currentThread().isInterrupted(true);
}


使用示例

@Test
public void test_Flag() {
 Thread currentThread = Thread.currentThread();
 currentThread.interrupt();
 System.out.println("当前线程状态 =" + currentThread.isInterrupted());
 System.out.println("当前线程状态 =" + Thread.interrupted());
 System.out.println("当前线程状态 =" + Thread.interrupted());
 /* 输出
 当前线程状态 =true
 当前线程状态 =true
 当前线程状态 =false*/
}

三、如何响应中断?

调用一个可中断的阻塞方法时需要处理受检异常InterruptException,一般来说最容易的方式就是继续抛出InterruptException ,让调用方决定对中断事件作出什么应对。但是对于一些不能在方法头直接添加异常声明的,可以catch出后再进行一些操作,例如使用Runnable时:

image-20210102214450199

一般来说当catch到中断时,应该对中断状态进行还原: 调用Thread.currentThread().interrupt();,除非明确自己的操作不会丢失线程中断的证据,从而剥夺了上层栈的代码处理中断的机会。

四、总结

对目标线程调用interrupt()方法可以请求中断一个线程,目标线程通过检测isInterrupted()标志获取自身是否已中断。如果目标线程处于阻塞状态,该线程会捕获到InterruptedException。一般来说不要catchInterruptException后不做处理(“生吞中断”)。

五、参考文章

https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

处理 InterruptedException

JAVA多线程之中断机制(如何处理中断?)

中断线程

JAVA多线程之中断机制(如何处理中断?)

Thread的中断机制(interrupt)

到此这篇关于java中断机制实例讲解的文章就介绍到这了,更多相关java中断机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Java注解和动态代理

    浅谈Java注解和动态代理

    这篇文章主要介绍了Java中有关注解和动态代理的一些知识,涉及了Annotation、数据类型等相关内容,需要的朋友可以参考下。
    2017-09-09
  • Spring Boot整合EasyExcel(完整版包含上传解析excel和下载模板)

    Spring Boot整合EasyExcel(完整版包含上传解析excel和下载模板)

    这篇文章主要介绍了Spring Boot整合EasyExcel(完整版包含上传解析excel和下载模板),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • gateway和jwt网关认证实现过程解析

    gateway和jwt网关认证实现过程解析

    这篇文章主要介绍了gateway和jwt网关认证实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java并发编程之工具类Semaphore的使用

    Java并发编程之工具类Semaphore的使用

    目前几乎所有的语言都支持信号量机制,Java也不例外.Java中提供了Semaphore并发工具类来支持信号量机制,下面我们就来了解Java实现的信号量机制,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • Java JDBC自定义封装工具类的步骤和完整代码

    Java JDBC自定义封装工具类的步骤和完整代码

    这篇文章主要给大家介绍了关于Java JDBC自定义封装工具类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 深入解析Java的Servlet过滤器的原理及其应用

    深入解析Java的Servlet过滤器的原理及其应用

    这篇文章主要介绍了深入解析Java的Servlet过滤器的原理及应用,Java编写的Servlet通常是一个与网页一起作用于浏览器客户端的程序,需要的朋友可以参考下
    2016-01-01
  • java队列之queue用法实例分析

    java队列之queue用法实例分析

    这篇文章主要介绍了java队列之queue用法实例分析,Queue 队列就是一个先入先出(FIFO)的数据结构,Queue接口继承Collection接口。感兴趣的可以了解一下
    2020-07-07
  • Springboot上传excel并将表格数据导入或更新mySql数据库的过程

    Springboot上传excel并将表格数据导入或更新mySql数据库的过程

    这篇文章主要介绍了Springboot上传excel并将表格数据导入或更新mySql数据库的过程 ,本文以Controller开始,从导入过程开始讲述,其中包括字典表的转换,需要的朋友可以参考下
    2018-04-04
  • Java内部排序之插入排序与交换排序详解

    Java内部排序之插入排序与交换排序详解

    这篇文章主要介绍了Java内部排序之插入排序与交换排序详解,排序是将任意序列重新排列按照关键字有序,排序根基存储器的不同分为内部排序、外部排序,排序根据关键字分为稳定排序、不稳定排序,需要的朋友可以参考下
    2023-12-12
  • Java多线程中的ThreadPoolExecutor使用解析

    Java多线程中的ThreadPoolExecutor使用解析

    这篇文章主要介绍了Java多线程中的ThreadPoolExecutor使用解析,作为线程池的缓冲,当新增线程超过maximumPoolSize时,会将新增线程暂时存放到该队列中,需要的朋友可以参考下
    2023-12-12

最新评论