您当前的位置: 首页 >  Java

java持续实践

暂无认证

  • 2浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

java持续实践 发布时间:2020-08-19 08:10:12 ,浏览量:2

文章目录
      • 线程中断 使用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代码块中, 进行一些针对出现异常的记录操作. 整个执行流程, 如下图所示 . 主要是最后一步不同.

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.1382s