interrupt的作用是终断本线程,stop和suspend是固有不安全的,所以禁止使用。
线程处于阻塞状态,调用interrupt,终断标志会被设置成true,由于线程处于阻塞状态,该终断标记会被立即清楚设置为false,并抛出interruptedException
终止处于阻塞状态的线程:
@Override
publicvoid run() {
while(true) {
try {
// 执行任务...}catch (InterruptedException ie) {
// InterruptedException在while(true)循环体内。
// 当线程产生了InterruptedException异常时,while(true)仍能继续运行!需要手动退出break;
}
}
}
终止运行状态的线程:
@Override
publicvoid run() {
while(!isInterrupted()) {
// 执行任务... }
}
通过isInterrupted判断是否中断,没有中断就继续运行,为了更好的控制逻辑可以增加标志位来控制中断
比较通用的终止线程的方式:
@Override
public void run() {
try {
// 1. isInterrupted()保证,只要中断标记为true就终止线程。
while (!isInterrupted()) {
// 执行任务...
}
} catch (InterruptedException ie) {
// 2. InterruptedException异常保证,当InterruptedException异常产生时,线程被终止。
}
}
最后谈一谈interrupted和isinterrupted的区别,俩个都返回终断状态的标志,前者会清除终断标志