private class ReceiveThread extends Thread {
public void run() {
super.run();
try {
while (!Thread.interrupted()) {
// a
sleep(20);
// b
}
} catch (InterruptedException e) {
// 对sleep的try-catch必须放在while外面
}
}
}
退出时调用 thread.interrupt() ,此时会有两种情况,均能成功销毁:
- 在 a 处或者 sleep 过程中 interrupt: sleep会报错,走到catch中从而跳出循环;
- 在 b 处 interrupt:线程仍然会循环,并在 while 中判断 !Thread.interrupted() 为 false 导致跳出循环。
另外,interrupt() 的作用本身并不是中断退出 thread,而是抛出一个中断信号,使线程在受到阻塞时导致一个中断异常InterruptedException。这样我们就能利用一个短时的 sleep 和 interrupt 关闭一个线程了。