文章目录
线程中断 使用try catch 错误方法演示
- 线程中断 使用try catch 错误方法演示
- 线程中断 优先选择在方法的签名中抛出异常
演示代码如下. run方法中 ,调用了throwInMethod()
方法 ,该方法使用了sleep, 并且使用了try catch, 捕获了异常.
public class RightWayStopThreadInProd implements Runnable {
@Override
public void run() {
while (true) {
System.out.println("print log");
throwInMethod();
}
}
private void throwInMethod() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new RightWayStopThreadInProd());
thread.start();
Thread.sleep(1000);
thread.interrupt();
}
}
运行程序后, 控制台打印如下. 可以看到 虽然打印出了异常, 但是程序依然在继续执行. 这样如果在实际开发中 ,是很难注意到程序出现了异常了的. 此方法的错误之处在于, 出现了异常, 调用的方法 , 使用try catch把异常给吞了. 实际上应该由方法的调用方去选择异常该如何进行处理. 上述代码的整个执行流程如下图:
优先选择在方法的签名中抛出异常 , 那么在run方法中, 就会强制的进行try/ catch . 代码修改为如下图所示, 可以看到根据提示,只能进行try catch 这是因为根据源码, run方法 并没有抛出异常. 因此子类重写run方法, 也只能try catch .
完整的代码如下
public class RightWayStopThreadInProd implements Runnable {
@Override
public void run() {
while (true) {
System.out.println("print log");
try {
throwInMethod();
} catch (InterruptedException e) {
// 针对异常的处理操作. 释放资源, 保存日志等等 .
System.out.println(" 出现异常, 保存日志 ");
e.printStackTrace();
}
}
}
private void throwInMethod() throws InterruptedException {
Thread.sleep(2000);
}
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new RightWayStopThreadInProd());
thread.start();
Thread.sleep(1000);
thread.interrupt();
}
}
程序运行如下 . 在sleep中,出现了异常, 在run方法中进行了捕获. 虽然没有成功的进行中断线程. 但是作为方法的调用方是知道了出现了异常了的, 可以在catch代码块中, 进行一些针对出现异常的记录操作. 整个执行流程, 如下图所示 . 主要是最后一步不同.