文章目录
前言:
没有任何java语言方面的需求要求一个被中断的程序应该终止。中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断 。
经验:
-
当一个线程调用interrupt方法时,线程的中断标识位将会被置true
-
可通过Thread.currentThread().isInterrupted()判断中断标识位
-
对于阻塞中的线程,如果检测到中断标识位为true,则会先将中断标识位置为false,并抛出InterruptedException,因此捕捉异常后需要Thread.currentThread().interrupt()再次打断,不然无法终止线程
Show code:
public class TestStopThread {
/**
*适用于中断任何线程,volitale变量标记法只适合中断不会阻塞的线程
*/
public void testStopMoonSafetly(){
Thread moon = new Thread(new MoonRunnable(), "moon");
moon.start();
SystemClock.sleep(1000);
moon.interrupt();
}
private static class MoonRunnable implements Runnable {
private long i;
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
//类似的还有socket.accept+obj.wait+thread.join
Thread.sleep(100);
i++;
Log.e("TestStopThread", "run: "+i);
} catch (InterruptedException e) {
//因为抛出异常后中断标示会被清除,再次打断,此时不会再抛异常,打断完成,线程结束
Thread.currentThread().interrupt();
//若屏蔽掉该方法,线程会继续运行,如果对某对象持有引用,则该对象无法销毁,导致泄漏
}
}
}
}
}
//线程池的shutDownNow()会将池中线程全部interrupt,此时线程本身应该对打断做出响应