java interruptedexception_如何正确的处理InterruptedException
何时会出现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相关推荐
- Java自动计算迷宫正确路线算法源码
简介: Java自动计算迷宫正确路线算法源码,首先迷宫需要满足存在开始标识和结束标识与墙标识,然后设置好行数与列数就可以开始计算正确路线了,采用的是为二维数组然后走遍所有路线的方式. 网盘下载地址: ...
- BaiduMapsApiDemo报错:请在 DemoApplication.java文件输入正确的授权Key
BaiduMaps的程序猿真是恶心,弄个BaiduMapsApiDemo,下载下来了还报错,让人申请授权Key: 请在 DemoApplication.java文件输入正确的授权Key!申请地址:ht ...
- 正确的java语句,下面哪条Java语句可以正确输出“HelloJava!”?()
下面哪条Java语句可以正确输出"HelloJava!"?() 更多相关问题 从企业管理的角度,技术创新就是一种新的思想的产生,到研究.发展.试制.生产制造到首次( )的过程. 西 ...
- Java 程序如何正确地打日志
本文来自作者 R哥 在 GitChat 上分享 「Java 程序如何正确地打日志」 什么是日志 简单的说,日志就是记录程序的运行轨迹,方便查找关键信息,也方便快速定位解决问题. 我们 Java 程序员 ...
- Java中如何正确使用字体编码
Java支持UTF-8.ISO-8859-1.GBK等各种字体编码,可笔者发现Java中字体编码的问题仍难倒了不少程序员,网上虽然也有不少关于在Java中如何正确显示中文的文章,但都不够全面,笔者特意 ...
- 使用java正则表达式的正确姿势
使用java正则表达式的正确姿势 文章目录 使用java正则表达式的正确姿势 一.用途 二.. * + ? 表示什么意思? 三.[]表示什么意思?(控制范围) 四.常用的"\字母" ...
- java中断异常_Java中断异常 InterruptedException 的正确处理方式
你看到这篇文件可能是因为你已经调用了一个抛出 InterruptedException 异常的方法,并且需要以某种方式处理它. 首先,需要了解为一个方法为啥会 throws InterruptedEx ...
- java 中如何正确的停止线程
如何优雅的停止一个线程 1.为什么要停止线程 2.为何说要正确的停止线程 3.使用interrupt()停止线程 4.线程在通常三种情况下停止 4.1 普通情况 4.2 线程阻塞情况 4.3 传递中断 ...
- java下列语句正确的是_下列Java语句中,不正确的一项是( )。
[多选题]装卸搬运机械具有( )功能 [判断题]char[] str="abcdefgh"; ( ) [单选题]7.关于内部类,下列说法不正确的是( ). [单选题]下列关于Jav ...
- 如何在Java中编写正确的微基准测试?
您如何用Java编写(并运行)正确的微基准测试? 我正在寻找一些代码示例和注释,以说明要考虑的各种问题. 示例:基准测试应测量时间/迭代或迭代/时间,为什么? 相关: 秒表基准测试是否可以接受? #1 ...
最新文章
- vue 绑定事件,获取元素对象
- 【错误记录】IntelliJ IDEA 中右键点击源码目录选择 New 选项 没有创建 Java Class 选项 ( 将对应的源码目录标记为 Sources 选项 )
- 2018新版正方教务 ---爬虫--- JAVA源码--课表--平时分----成绩-----排名----考试安排...
- hdu 2025 查找最大元素 (水)
- Delphi识别读取验证码
- 前后端分离的思考与实践(二)
- 消息称谷歌Pixel系列手机默认禁用美颜功能
- 原型模式(Prototype)以及深浅复制
- 华为机试HJ27:查找兄弟单词
- Maven 集成Tomcat插件(引用)
- dnf服务器地址修改,修改dnf单机服务器地址
- ARKit入门到精通-1.5 -基础内容-史小川-专题视频课程
- Google翻译(Java)
- 通过Python实现九九乘法表
- ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天...
- 输入框常规测试数据用例设计
- 19 「沉淀」,20「继续沉淀」
- SML(standard ML)入门学习(1)
- 均州古城(走遍中国08.10.27)
- Java判断手机号格式