检查线程中断状态
每一个线程都有一个记录该线程中断状态的标记位,这是一个 boolean 标记。每个线程都应该不时地检查这个标记位以确定线程是否已经被中断。
调用 interrupt 方法可以请求终止线程,也就是将成功调用 interrupt 方法的线程的中断标记位置为 true。
如果我们想知道线程是否被置位,应该操作:
① 调用静态的 Thread.currentThread 方法获得当前线程
② 调用 isInterrupt 方法检查标记位
while(!Thread.currentThread().isInterrupt()){}
处于阻塞状态的线程,无法检查它的中断状态。如果试图检查阻塞线程的中断状态就会产生 InterruptedException 异常
interrupted 和 isInterrupted
有两个非常类似的方法 interrupted 和 isInterrupted, (interrupted 区别于interrupt方法,interrupt方法用来请求中断)
interrupted 方法是一个静态方法,它检测当前的线程是否被中断,而且调用 interrupted 方法后会清除该线程的中断状态,将当前线程中断状态位置为 false
isInterrupted 方法是一个实例方法,可以用来检测是否有线程被中断,调用这个方法不会改变线程的中断状态
不要忽略 InterruptedException
有两种方法处理 InterruptedException
1. 在 catch 子句中调用 Thread.currentThread().interrupt() 来设置中断状态
void Test(){
...
try { sleep(delay); }
catch (InterruptedException e) { Thread.currentThread().interrupt(); }
}
2. 用 throws InterruptedException 标记方法
void Test() throws InterruptedException{
...
sleep(delay);
...
}