一、Thread.stop()方法来结束线程的运行是很危险,一般不建议使用stop()来停止线程;不安全的原因主要有:在程序调用Thread.stop()后会抛出ThreadDeatherror()错误。并释放子线程所持有的所有锁,会导致被保护数据呈现不一致性,此过程不可控。实际运行这么用app直接挂了。
二、 java 使用线程(Thread)自带的isInterrupted()方法来结束线程。isInterrupted()判断是否被中断,并清除当前中断状态。
1、代码如下
mGpsTimerThread = new Thread() {
public void run() {
while(!isInterrupted()) {
Log.d(TAG, "isTimeout=" + badgeCount++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
Log.d(TAG, "InterruptedException,exit now!");
break;
}
}
}
};
2、 线程处于阻塞状态,如线程中使用了sleep(),同步锁 wait(),socket的receiver,accept方法时,会使线程进入到阻塞状态,当程序调用interrupted()方法时,会抛出InterrupteException异常。阻塞中的那个方法抛出异常,通过捕获该异常,然后break跳出循环,从而结束该线程。注:不是调用了interrupted()方法就会结束线程,是捕获到了interruptedException异常后,break 跳出循环后才能结束此线程。
3、 线程未处于阻塞状态,调用interrupted()方法时,实际上是通过判断线程的中断标记来退出循环。
三、实际运行,执行mGpsTimerThread.interrupt();后会退出线程。
五、参考文章