Java-关于线程中断处理的方法问题

Java-关于线程中断处理的方法问题

灵芸 发布于 2017-09-15 字数 200 浏览 1156 回复 3

为什么有判断Thread.interrupted()又有捕获InterruptedException?中断是异常还是boolean

try{
while(!Thread.interrupted()){
...
}
} catch(InterruptedException e){
...
}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

归属感 2017-10-26 3 楼

当循环里面含有:Object.wait, Thread.sleep 以及 Thread.join 方法的话,外部调用 interrupt 可收到中断异常,退出循环

但是很多时候 interrupt 时常会有调用后依然运行等等各类问题,推荐使用共享变量的方式
在线程中添加一个 boolean 类型的变量用于记录当前是否运行继续运行,比如:

private boolean isStopped = false;
...
while(false == isStopped) {...}

当需要在外部终止程序时,通过 setStopped(true) 的方式来修改内部 isStopped 变量

public void setStopped(boolean stop)
{isStopped = stop;}

这样子当程序重复循环的时候会自动退出 while
而且也不会产生 InterruptedException

偏爱自由 2017-10-24 2 楼

我在@用通俗的语言说说lock和lockInterruptibly的区别里写了一点,先粘过来:

先说说线程的打扰机制,每个线程都有一个 打扰 标志。这里分两种情况,
1. 线程在sleep或wait,join, 此时如果别的进程调用此进程的 interrupt()方法,此线程会被唤醒并被要求处理InterruptedException;(thread在做IO操作时也可能有类似行为,见java thread api)
2. 此线程在运行中, 则不会收到提醒。但是 此线程的 “打扰标志”会被设置, 可以通过isInterrupted()查看并 作出处理。

我觉得可以做如下类比:
1.你(thread)睡觉的时候,把手机(JVM)设为 提醒模式, 这样有短信息进来(thread.interrupt()),手机会报警(InterruptedException),你会被叫醒来处理;
2. 白天的时候, 把手机设为 静音模式,你只有 自己去检查手机,才知道有新的短信 进来(thread.isInterrupted()==true)。

推荐 Java Concurrency in Practice, 第7.1节,Task Cancellation. 大师们把这些 介绍的非常详细了。


想了一下,其实 Java 里的 interrupt 真不应该翻译成 ‘中断’,100% 误导啊。翻译成 ‘打扰’ 就好多了,如果线程足够酷,走自己的路,让别人打扰去吧。

偏爱自由 2017-10-10 1 楼

有些中断是通过产生异常传递的,有些是改变状态的。例如sleep是会被异常中断的,

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