• 小记:executor.shutdownNow无法关闭线程池,线程池卡死


    一定要注意子线程的InterruptedException异常处理,要throw出来,不要吞掉!
    正确案例:

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    public class Demo {
        public static void main(String[] args) {
            ExecutorService executorService = Executors.newFixedThreadPool(2);
            executorService.submit(new SubThread());
            executorService.submit(new SubThread());
            executorService.shutdown();
            try {
                if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
                    System.out.println("线程池关闭超时");
                    executorService.shutdownNow();
                    if (!executorService.awaitTermination(3, TimeUnit.SECONDS)) {
                        System.out.println("线程池强制关闭失败");
                    } else {
                        System.out.println("线程池强制关闭成功");
                    }
                } else {
                    System.out.println("线程池关闭成功");
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
    class SubThread implements Runnable {
        @Override
        public void run() {
            while (true) {
                System.out.println(Thread.currentThread().getName());
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    // 抛出异常
                    throw new RuntimeException(e);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    错误案例:

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    public class Demo {
        public static void main(String[] args) {
            ExecutorService executorService = Executors.newFixedThreadPool(2);
            executorService.submit(new SubThread());
            executorService.submit(new SubThread());
            executorService.shutdown();
            try {
                if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
                    System.out.println("线程池关闭超时");
                    executorService.shutdownNow();
                    if (!executorService.awaitTermination(3, TimeUnit.SECONDS)) {
                        System.out.println("线程池强制关闭失败");
                    } else {
                        System.out.println("线程池强制关闭成功");
                    }
                } else {
                    System.out.println("线程池关闭成功");
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
    class SubThread implements Runnable {
        @Override
        public void run() {
            while (true) {
                System.out.println(Thread.currentThread().getName());
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    // 没有抛出异常,线程池将卡死,无法退出
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    高效能团队的Java研发规范(进阶版)
    谷歌成功利用一台 54 量子比特的量子计算机
    数据化管理洞悉零售及电子商务运营——零售密码
    【Linux】ping命令详解
    【temu】分析拼多多跨境电商Temu数据分析数据采集
    赛芯电子冲刺科创板上市:拟募资6.23亿元,共有64项专利申请信息
    基于php+thinkphp+vue的校园二手交易网站
    Linux网络-MAC协议
    内存取证——ABC包
    JVM常见面试题
  • 原文地址:https://blog.csdn.net/qq_44880708/article/details/134424648