首先不要使用 thread.stop() 方法,该方法会强制线程立即停止执行,不安全,造成不可预知的错误。
推荐使用 thread.interrupt() 来温和地停止线程,该方法不立即、不强制停止线程,默认是不停止线程的。只是标记希望该线程被interrupt。该方法需要被打断的线程检查 interrupt 状态才可停止。isInterrupted() 方法只是单纯检查自身所在线程是否被标记为了希望被打断,而 interrupted() 在自身线程被标记为希望被打断时会返回 true,并且同时清除当前线程的中断状态(置为false)。
如下面代码所示
Thread thread = new Thread() {
@Override
public void run() {
for (int i = 0; i < 1000000; i++) {
// // 在执行耗时操作之前,
// // isInterrupted()
// // 单纯检查自身所在线程是否被标记为了打断
// if (isInterrupted()) {
// // 作收尾工作
// return;
// }
// 在执行耗时操作之前,
// Thread.interrupted()
// 检查自身所在线程是否被标记为了打断,
// 并且会清除当前线程的中断状态(置为false)。
if (interrupted()) {
// 作收尾工作
return;
}
// 执行一些耗时操作。
System.out.println("number:" + i);
}
}
};
thread.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// // 强制线程立即停止执行,不安全,造成不可预知的错误
// thread.stop();
// 温和版本的停止线程,不立即,不强制,默认不停止。
// 标记希望该线程被interrupt
// 该方法需要被打断的线程检查interrupt状态来停止
thread.interrupt();