线程中断
本人理解为线程之间(也可以是线程自己跟自己)打招呼,让你停下来,但是具体的停不停自己说了算。线程可以有三个选择:一,让jvm把我停止吧(由jvm控制);二,做个收尾工作,之后return;三,我凭啥听你的,不停。
第一种做法:java中调用一个线程的interrupt()方法。这个方法只是给线程的中断标志位设置为true,具体何时来实施中断的动作是由jvm来控制。对于这个中断标志,如果线程不清除这个中断标志,最后是被jvm来停止这个线程。
下面看下第二种和第三种。
那这里就会提出问题,我想执行了interrupt()方法后立即让程序停止如何做呢?往下看,我们接下来看两个方法
boolean: interrupted() 类方法,作用:返回线程的中断标志位,返回中断标志位后直接将中断标志位reset(重新设置为false)。
boolean: isInterrupted() 实例方法,作用:返回线程的中断标志位。
立即停止线程的做法可以通过调用 interrupted()类方法(代码第二种),循环执行条件加入!interrupted()条件判断,并将标志位重置为false(不让jvm帮你中断),然后收尾,或者不停继续按我的条件运行(代码第三种)。
第二种
void run() {
....
while (!interrupted()) { // 执行这个方法中断标志就会被reset
....
}
return;
}
第三种
void run() {
....
while (XXX) {
if (interrupted()) { // 执行这个方法中断标志就会被reset
print("收到中断")
}
....
}
return;
}
上面都是线程正在运行的情况,那当线程阻塞(等待)的时候呢。当线程阻塞时(例如sleep,wait,join),线程收到中断请求后,将reset中断标志位(false)并被唤醒,抛出InterruptException。至于后续怎么做则交给线程自己来决定(如代码1)。
代码1
void run() {
....
while (true) { // 执行这个方法中断标志就会被reset
try {
sleep(1000000000);
} catch (InterruptedException ex) {
print("异常")
}
}
....
return;
}
当线程阻塞在 可被阻止的I/O操作 或者 Selector中,则线程立即返回,中断标志位被设置(jvm会把线程停止)。
完成,如果又不对的地方,大家随意拍砖,共同成长学习。