文档章节

中断状态与InterruptedExceptin异常的相互转换

恶魔在江湖
 恶魔在江湖
发布于 2014/02/18 15:03
字数 734
阅读 53
收藏 0

调用interrupt方法后,可以中断掉线程。这里所说中断掉线程,是指下面其中一种结果。

(1)线程变成“中断状态”对“状态”的反应;

(2)抛出“异常InterruptedException”对“控制”的反应。

通常会使(1)。只有在线程是sleep、wait、join时会是(2)(这个时候不会变成中断状态)。

然而,状态(1)、(2)是可以相互转换的。也就是说,可以把(1)变为(2),也可以把(2)变为(1)。配合程序的需要——大致上就是为了让程序不至于忘记被中断的事实——而加以变化。

下面是具体的说明:

中断状态 -> InterruptedException异常的转换

“若线程是中断状态,就抛出InterruptedException异常”,可以像下面这样写。其中interrupted方法,是java.lang.Thread类的类方法。

if(Thread.interrupted()){
    throw new InterruptedException();
}

在花时间的处理前,先加上这个if语句,可提高程序对中断的响应性。可以避免不知道自己已经被中断,还开始进行花时间的处理。

反倒是,这个if语句乍看之下很简单,要完全了解倒比想象中复杂许多。

哪个线程来检查interrupted方法

Thread.interrupted方法,会检查Thread.currentThread()的中断状态。也就是说,上面的if语句无论卸载哪个类的哪个方法,都是检查执行if语句的线程的中断状态。

不想清除中断状态的时候

调用Thread.interrupted方法后,线程就不是中断状态了。也就是说,只要调用一次Thread.interrupted方法后,中断状态就会被清除。

如果不想清除中断状态,而要检查现在线程是否被中断,要使用isInterrupted实例方法。调用方式如下:

if(Thread.currentThread.isInterrupted()){
    //若为中断中断时需要进行的处理(中断状态不会清除)
}

InterruptedException异常 -> 转换为中断状态

想要让线程只有在指定的时间才停止时,可以使用Thread.sleep方法。因为Thread.sleep会抛出InterruptedException异常,所以可能我们需要经常会这样写:

try {
    Thread.sleep(1000);
} catch (InterruptedException e){
}

不过,这样写的话,抛出的InterruptedException异常会被忽略。当sleep被其他线程interrupt时,“被中断”这个事实会消失。

若当我们不希望被中断这个事实消失时,就像下面这样,自己再重新中断自己一次。

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    Thread.currentThread.interrupt();
}

这样可以将收到的InterruptedException异常转换为中断状态的形式。

InterruptedException异常 -> 转换为InterruptedException异常

收到的InterruptedException异常,也可以不马上抛出来,而留下来晚点再抛。如下:

  InterruptedException savedException = null;
  ...
  
  try {
      Thread.sleep(1000);
  } catch (InterruptedException e) {
      savedException = e;
  }
  ...
  if (savedException != null){
      throw savedException;
  }

在这里,先将收到的InterruptedException存在变量savedException里,留到后面才throw出去。

内容来源于《Java多线程设计模式》一书,方便以后查看。

© 著作权归作者所有

共有 人打赏支持
恶魔在江湖
粉丝 5
博文 19
码字总数 7329
作品 0
朝阳
程序员
内功修炼之操作系统学习(二:处理器管理)

处理器管理 处理器管理是操作系统的重要组成部分,它负责调度、管理和分配处理器并控制程序的执行。处理器管理中最重要的是处理器调度,即进程调度,也就是控制、协调进程对处理器的竞争。为...

长平狐
2012/10/08
213
0
JAVA Thread的中断机制(interrupt)

Thread的中断机制(interrupt) 中断线程 线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步...

北极心
2015/11/20
0
0
关闭线程的正确姿势,实现“优雅”的中断

width="603px" src="http://ss.csdn.net/p?http://mmbiz.qpic.cn/mmbizjpg/pzKp1L04Evjtj54s91X3o5fiaOukoCHaF3qd1AOQZEcZrViaM2mpJ9SWbp5ialqZpRiaQaxYR9AnUNwDcx6tHHmdzQ/640?wxfmt=jpeg&w......

bjweimengshu
2017/12/28
0
0
关闭线程的正确方法:“优雅”的中断

前文从任务到线程:Java结构化并发应用程序中介绍了如何安排任务启动线程。 线程在启动之后,正常的情况下会运行到任务完成,但是有的情况下会需要提前结束任务,如用户取消操作等。可是,让...

登高且赋
2017/10/27
0
0
JUC锁框架——CyclicBarrier

CyclicBarrier的简单介绍 CyclicBarrier是一个同步辅助类,它允许一组线程相互等待,直到到达某个公共屏障点(common barrier point)。通过它可以完成多个线程之间相互等待,只有当每个线程...

长头发-dawn
09/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Dubbo分析之Transport层

前言 上一篇文章Dubbo分析之Serialize层,介绍了最底层的序列化/反序列化层,本文继续分析Serialize层的上一层transport网络传输层,此层使用了现有的一些通讯开源框架(ex:netty,mina,grizzl...

ksfzhaohui
7分钟前
0
0
通告!Android 9 Pie未适配应用公示

8月7日,谷歌正式发布Android 9 Pie,至今已两月有余。近日,华为终端开放实验室对国内主流应用在Android 9 Pie的兼容性进行测试,结果显示:目前TOP3000应用兼容率已经超过95%,但仍有少量应...

安卓绿色联盟
9分钟前
0
0
Linux下多网卡绑定模式详解

在我们日常Linux使用中,一般对于生产网都会使用双网卡或多网卡接入,这样既能添加网络带宽,同时又能做相应的冗余,可谓好处多多。而一般我们都会使用Linux操作系统下自带的网卡绑定模式。这...

openthings
10分钟前
0
0
SylixOS中AARCH64跳转表实现原理

1. 跳转表存在的意义 1.1 内核模块反汇编 如下的程序清单,为一个内核模块的源码。 #define __SYLIXOS_KERNEL#include <SylixOS.h>#include <module.h> /* * SylixOS call module_i......

zhywxyy
12分钟前
0
0
聊一聊 Spring 中的线程安全性

本文摘自ImportNew公众号,摘录做学习资料,向大家推荐该公众号 Spring与线程安全 Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”。但其实,Spring并没有保证这些对象的线程安...

木子SMZ
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部