• 小记: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
  • 相关阅读:
    win10超好看的鼠标主题,你也来试试吧
    云原生技术--- 容器知识点
    Linux 处理文件( touch 命令、cp 命令、mv 命令、rm 命令)
    java基础-mysql
    PEG包裹上转换荧光纳米颗粒
    Could not find resource src/config/dataConfig.xml错误
    深拷贝-浅拷贝-引用赋值的写法
    19种分布式系统设计模式
    使用ServiceSelf解决.NET应用程序做服务的难题
    从语法到AI率:用ChatGPT润色论文的3个误区
  • 原文地址:https://blog.csdn.net/qq_44880708/article/details/134424648