Java多线程 中断线程最优方法之 优先抛出

文章目录

      • 线程中断 使用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();
    }
}

运行程序后, 控制台打印如下. 可以看到 虽然打印出了异常, 但是程序依然在继续执行. 这样如果在实际开发中 ,是很难注意到程序出现了异常了的.
Java多线程 中断线程最优方法之 优先抛出_第1张图片
此方法的错误之处在于, 出现了异常, 调用的方法 , 使用try catch把异常给吞了.
实际上应该由方法的调用方去选择异常该如何进行处理.
上述代码的整个执行流程如下图:
Java多线程 中断线程最优方法之 优先抛出_第2张图片

线程中断 优先选择在方法的签名中抛出异常

优先选择在方法的签名中抛出异常 , 那么在run方法中, 就会强制的进行try/ catch .
代码修改为如下图所示, 可以看到根据提示,只能进行try catch
Java多线程 中断线程最优方法之 优先抛出_第3张图片
这是因为根据源码, run方法 并没有抛出异常. 因此子类重写run方法, 也只能try catch .
Java多线程 中断线程最优方法之 优先抛出_第4张图片
完整的代码如下

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代码块中, 进行一些针对出现异常的记录操作.
Java多线程 中断线程最优方法之 优先抛出_第5张图片
整个执行流程, 如下图所示 . 主要是最后一步不同.
Java多线程 中断线程最优方法之 优先抛出_第6张图片

你可能感兴趣的:(Java多线程基础与核心)