支持中断的阻塞方法
@Override
public void run() {
while(true) {
try {
Thread.sleep(10000);
} catch (InterruptedException exit) {
break; //不处理异常直接跳出是不规范的,大家尽量处理异常
}
}
}
上面的代码调用Thread.sleep()。当Thread.sleep()检测到中断时,抛出InterruptedException,调用者退出循环。所有支持InterruptedException的阻塞方法也清除中断状态。当捕获此异常时,必须对中断进行操作,或者设置中断状态,以便让堆栈上方的代码有机会对中断进行操作。
不支持中断的阻塞方法
一些阻塞方法(如内置的java.net.Socket)不支持中断。那么,如何中断ServerSocket.accept()方法呢?我们可以通过从另一个线程调用Socket.close()来实现这一点,强制Socket.accept()抛出异常并退出阻塞调用。
我重写了interrupt()方法:
@Override
public void interrupt() {
try {
_Socket.close();
} catch (IOException ignored) {
} finally {
super.interrupt();
}
}
这样再去调用interrupt()就可以直接中断线程啦
注意:_Socket是我自己写的线程里面的一个Socket全局变量。
我写的比较粗糙,具体可以参考:
点击此处直接跳转
具体地址: https://codeahoy.com/java/How-To-Stop-Threads-Safely/