Java终止子线程
使用 interrupt()
设置线程为中断状态,以此通知线程,作为一个结束的信号。
使用 isInterrupt()
检查线程的状态是否为中断状态以此作为结束的标志。
当被设置 interrupt()
的线程处在等待状态中,如sleep之中,就会出现 InterruptedException
异常。可以在catch捕获并且退出。
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
sleep(1000);
System.out.println("run!!!");
if (Thread.currentThread().isInterrupted()) {
System.out.println("end sub thread by interrupt");
break;
}
}
} catch (InterruptedException e) {
// e.printStackTrace();
System.out.println("end sub thread by interrupt exception");
}
}
});
t1.start();
try {
sleep(4000);
} catch (Exception e) {
e.printStackTrace();
}
t1.interrupt();
sleep(1000);
System.out.println("end main");
}
}
最开始遇见这个问题的时候是在Android 服务里面的,Android Service 是默认运行在主线程的,服务操作一般又比较耗时,需要手动的开启一个子线程运行业务代码。当时写了一个小demo,大致意思是,在服务类的子线程执行一个死循环,作为测试服务组件的特性的。问题出现了 开启服务,子线程正常运行,销毁服务后,子线程却不会随着活动的销毁而销毁。
于是想到了当销毁服务的时候,直接干掉子线程,于是找打了这种方法,千万要注意的是需要去捕获 InterruptedException
这个异常。否则非常课能出错(sleep
等情况下)。
现在想来当时的情况为什么不直接设置一变量,在while的时候检查一下,然后直接退出算了。