何时会出现InterruptedException?

当一个线程处于阻塞状态下(例如休眠)的情况下,调用了该线程的interrupt()方法,则会出现InterruptedException。

@Test

public void testName() throws Exception {

// 被中断的线程

final Thread t = new Thread(){

@Override

public void run() {

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

// 当调用t.interrupt(),则会刨除此异常

e.printStackTrace();

}

}

};

// 去中断t的线程

new Thread(new Runnable() {

public void run() {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

t.interrupt();

}

}).start();

t.start();

t.join();

}

View Code

先说结论:

public void interrupt()方法意为向该线程发起中断请求,所以当出现此异常的情况下,如果该线程在此时应该被中断,不要吞掉此异常信息,则应该在catch块里完成任务的情况工作,如果该线程不应该在此时被中断,则应该调用Thread.currentThread().interrupt() 方法设置中断标示,让后续的代码来检查并处理异常,通过Thread.interrupted()方法,可以检查中断标记。

概括如下:1.不要生吞此异常;2.如果可以处理此异常:完成清理工作之后退出;3.不处理此异常,不继续执行任务:重新抛出;4.不处理此异常,继续执行任务:捕捉到异常之后恢复中断标记(交由后续程序检查中断)。下面对上述提到的Thread.currentThread().interrupt() 和 Thread.interrupted() 二个方法进行解释:(长相相似,注意区分)

public void interrupt() 方法解释:

作用:

代替废弃的stop()方法[暴力停止线程],不直接中止线程,而是传递给目标线程一个“应该关闭”的信号,由目标线程自行处理。

“应该关闭”的信号的具体体现:

当目标线程处于阻塞状态,会抛出InterruptedException,而不会将标示位设置为true。当目标线程处于非阻塞状态,会将标示位设置为true,不会抛出异常。

应用场景:

取消“可取消的任务”举例:当用户发起一项请求,后端的代码正在进行(可能此任务的代码运行时间比较长),这个时候用户想取消这个请求,如果直接调用stop()方法,则此线程会“戛然而止”,我们都知道,web的请求绝大情况下都会有对于数据库的操作,然后此时线程退出,则事务没有提交,这就会造成数据不一致的情况;或者该线程正在持有redis中的锁,那么这样的话,就会造成锁不能及时的释放,所以要使用interrupted()方法,但是这还不够,我们需要在代码中适当的位置检查中断请求,使用Thread.interrupted()静态方法,然后返回true,则进行相应的取消处理。

static boolean interrupted() 方法解释:

作用:测试当前线程是否已被中断:返回中断标示位,并且重置中断标示位为false。

java interruptedexception_如何正确的处理InterruptedException相关推荐

  1. Java自动计算迷宫正确路线算法源码

    简介: Java自动计算迷宫正确路线算法源码,首先迷宫需要满足存在开始标识和结束标识与墙标识,然后设置好行数与列数就可以开始计算正确路线了,采用的是为二维数组然后走遍所有路线的方式. 网盘下载地址: ...

  2. BaiduMapsApiDemo报错:请在 DemoApplication.java文件输入正确的授权Key

    BaiduMaps的程序猿真是恶心,弄个BaiduMapsApiDemo,下载下来了还报错,让人申请授权Key: 请在 DemoApplication.java文件输入正确的授权Key!申请地址:ht ...

  3. 正确的java语句,下面哪条Java语句可以正确输出“HelloJava!”?()

    下面哪条Java语句可以正确输出"HelloJava!"?() 更多相关问题 从企业管理的角度,技术创新就是一种新的思想的产生,到研究.发展.试制.生产制造到首次( )的过程. 西 ...

  4. Java 程序如何正确地打日志

    本文来自作者 R哥 在 GitChat 上分享 「Java 程序如何正确地打日志」 什么是日志 简单的说,日志就是记录程序的运行轨迹,方便查找关键信息,也方便快速定位解决问题. 我们 Java 程序员 ...

  5. Java中如何正确使用字体编码

    Java支持UTF-8.ISO-8859-1.GBK等各种字体编码,可笔者发现Java中字体编码的问题仍难倒了不少程序员,网上虽然也有不少关于在Java中如何正确显示中文的文章,但都不够全面,笔者特意 ...

  6. 使用java正则表达式的正确姿势

    使用java正则表达式的正确姿势 文章目录 使用java正则表达式的正确姿势 一.用途 二.. * + ? 表示什么意思? 三.[]表示什么意思?(控制范围) 四.常用的"\字母" ...

  7. java中断异常_Java中断异常 InterruptedException 的正确处理方式

    你看到这篇文件可能是因为你已经调用了一个抛出 InterruptedException 异常的方法,并且需要以某种方式处理它. 首先,需要了解为一个方法为啥会 throws InterruptedEx ...

  8. java 中如何正确的停止线程

    如何优雅的停止一个线程 1.为什么要停止线程 2.为何说要正确的停止线程 3.使用interrupt()停止线程 4.线程在通常三种情况下停止 4.1 普通情况 4.2 线程阻塞情况 4.3 传递中断 ...

  9. java下列语句正确的是_下列Java语句中,不正确的一项是( )。

    [多选题]装卸搬运机械具有( )功能 [判断题]char[] str="abcdefgh"; ( ) [单选题]7.关于内部类,下列说法不正确的是( ). [单选题]下列关于Jav ...

  10. 如何在Java中编写正确的微基准测试?

    您如何用Java编写(并运行)正确的微基准测试? 我正在寻找一些代码示例和注释,以说明要考虑的各种问题. 示例:基准测试应测量时间/迭代或迭代/时间,为什么? 相关: 秒表基准测试是否可以接受? #1 ...

最新文章

  1. vue 绑定事件,获取元素对象
  2. 【错误记录】IntelliJ IDEA 中右键点击源码目录选择 New 选项 没有创建 Java Class 选项 ( 将对应的源码目录标记为 Sources 选项 )
  3. 2018新版正方教务 ---爬虫--- JAVA源码--课表--平时分----成绩-----排名----考试安排...
  4. hdu 2025 查找最大元素 (水)
  5. Delphi识别读取验证码
  6. 前后端分离的思考与实践(二)
  7. 消息称谷歌Pixel系列手机默认禁用美颜功能
  8. 原型模式(Prototype)以及深浅复制
  9. 华为机试HJ27:查找兄弟单词
  10. Maven 集成Tomcat插件(引用)
  11. dnf服务器地址修改,修改dnf单机服务器地址
  12. ARKit入门到精通-1.5 -基础内容-史小川-专题视频课程
  13. Google翻译(Java)
  14. 通过Python实现九九乘法表
  15. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天...
  16. 输入框常规测试数据用例设计
  17. 19 「沉淀」,20「继续沉淀」
  18. SML(standard ML)入门学习(1)
  19. 均州古城(走遍中国08.10.27)
  20. Java判断手机号格式

热门文章

  1. 菜鸟的Python学习之路(流水账)
  2. PHP可以通过什么组件上传大文件
  3. SQL Server 2008,三年等待物有所值
  4. 软件开发过程中最重要的是人?还是领导者?
  5. Android之在不同的Activity之间传递数据
  6. SQL中的count()、sum()函数内加条件
  7. Kibana 自定义索引模式 Index patterns
  8. 短路主板电源针,启动电脑的办法
  9. LINUX下载编译libpng
  10. 预言梦可能破坏质能守恒定律