zoukankan      html  css  js  c++  java
  • 使用RunTime.getRunTime().addShutdownHook优雅关闭线程池

    有时候我们用到的程序不一定总是在JVM里面驻守,可能调用完就不用了,释放资源.

    RunTime.getRunTime().addShutdownHook的作用就是在JVM销毁前执行的一个线程.当然这个线程依然要自己写.

    利用这个性质,如果我们之前定义了一系列的线程池供程序本身使用,那么就可以在这个最后执行的线程中把这些线程池优雅的关闭掉.

    github地址点击此处

    比如我们定义了一个线程池

    private ExecutorService streamThreadPool = Executors.newFixedThreadPool(streamNum);

    然后我们需要对它进行优雅关闭

    Runtime.getRuntime().addShutdownHook(new Thread() {
       public void run() {
          shutdownGracefully();
       }
    });
    public void shutdownGracefully() {
       shutdownThreadPool(streamThreadPool, "main-pool");
    }
    
    /**
     * 优雅关闭线程池
     * @param threadPool
     * @param alias
     */
    private void shutdownThreadPool(ExecutorService threadPool, String alias) {
       log.info("Start to shutdown the thead pool: {}", alias);
    
       threadPool.shutdown(); // 使新任务无法提交.
       try {
          // 等待未完成任务结束
          if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) {
             threadPool.shutdownNow(); // 取消当前执行的任务
             log.warn("Interrupt the worker, which may cause some task inconsistent. Please check the biz logs.");
    
             // 等待任务取消的响应
             if (!threadPool.awaitTermination(60, TimeUnit.SECONDS))
                log.error("Thread pool can't be shutdown even with interrupting worker threads, which may cause some task inconsistent. Please check the biz logs.");
          }
       } catch (InterruptedException ie) {
          // 重新取消当前线程进行中断
          threadPool.shutdownNow();
          log.error("The current server thread is interrupted when it is trying to stop the worker threads. This may leave an inconcistent state. Please check the biz logs.");
    
          // 保留中断状态
          Thread.currentThread().interrupt();
       }
    
       log.info("Finally shutdown the thead pool: {}", alias);
    }

    这样我们就可以在JVM销毁前无论有没有执行的线程都会进行中断,然后关闭线程池.

  • 相关阅读:
    Akka详细介绍
    列举spark所有算子
    command not found所有执行命令总是报找不到
    Spark启动报错|java.io.FileNotFoundException: File does not exist: hdfs://hadoop101:9000/directory
    斐波那契数列的优化
    ganglia之web界面介绍
    linux环境下载和安装scala
    windows清空电脑的DNS缓存
    win10安装mysql一直卡在最后一步进行不下去
    maven的依赖管理详细
  • 原文地址:https://www.cnblogs.com/felixzh/p/11841601.html
Copyright © 2011-2022 走看看