线程池优雅关闭

简介: 如果程序中不再持有线程池的引用,并且线程池中没有线程时,线程池将会自动关闭。线程池自动关闭的两个条件:线程池的引用不可达;线程池中没有线程。

第一种方法


首先看下源码注释:


  • A pool that is no longer referenced in a program AND
  • has no remaining threads will be {@code  shutdown} automatically. If
  • you would like to ensure that unreferenced pools are reclaimed even
  • if users forget to call {@link  #shutdown}, then you must arrange
  • that unused threads eventually die, by setting appropriate
  • keep-alive times, using a lower bound of zero core threads and/or
  • setting {@link  #allowCoreThreadTimeOut(boolean)}.  


如果程序中不再持有线程池的引用,并且线程池中没有线程时,线程池将会自动关闭。


线程池自动关闭的两个条件:

  • 线程池的引用不可达;
  • 线程池中没有线程。

这里对于条件2解释一下,线程池中没有线程是指线程池中的所有线程都已运行完自动消亡。然而如果我们ThreadPool的核心线程没有超时策略,线程池并不会自动关闭。


所以需要设置:


//线程池在执行完任务后,经过超时时间,将所有空闲的线程都释放掉,进程池这样进程就可以退出
pool.allowCoreThreadTimeOut(true);


第二种方法


利用Runtime.getRuntime().addShutdownHook 和guava的方法优雅关闭


static {
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("====开始关闭线程池");
        CommonThreadPool.gracefulShutdown(pool, 10, TimeUnit.SECONDS);
        System.out.println("====结束关闭线程池");
      }
    }));
  }
public static boolean gracefulShutdown(ExecutorService threadPool, int shutdownTimeout,
      TimeUnit timeUnit) {
    return threadPool == null || MoreExecutors
        .shutdownAndAwaitTermination(threadPool, shutdownTimeout, timeUnit);
  }


误区


不要将线程池线程设置为守护线程,虽然守护线程不会阻止 JVM 退出,但这样做有问题,如果有还未执行完的任务就会出现异常了,(任务还没执行完就退出


相关文章
|
Java Spring
如何优雅的关闭线程池?
使用自创建的线程跟使用线程池有啥区别?提到线程池是不是脑海中闪现了创建线程池的那几个核心参数、工作流程、线程池的复用、拒绝机制、缓冲机制等,这些理论知识点想必也牢记许久了。虽然线程池支持在虚拟机进程接受到退出命令后可以进行shutdown。那么shutdown跟线程中断又有什么区别?在运行中的线程能否直接kill掉?我们能否监听关闭事件进行补偿?
2618 1
如何优雅的关闭线程池?
|
8月前
|
Java 数据库连接
【线程池使用完毕为何必须shutdown】
【线程池使用完毕为何必须shutdown】
136 0
|
18天前
|
存储 Java
什么是线程池,线程池的状态,线程池的用法示例
什么是线程池,线程池的状态,线程池的用法示例
|
9月前
|
Java 调度
线程池如何知道一个线程的任务已经执行完成
线程池如何知道一个线程的任务已经执行完成
367 0
C#中开启线程的四种方法
C#中开启线程的四种方法
|
缓存 算法 Java
创建线程池的7种方法
创建线程池的7种方法
187 1
|
Java 调度
Java多线程 关闭线程池 shutdown() 、shutdownNow()、awaitTermination()
Java多线程 关闭线程池 shutdown() 、shutdownNow()、awaitTermination()
221 0
Java多线程 关闭线程池 shutdown() 、shutdownNow()、awaitTermination()
|
Java
【多线程:线程池】ThreadPoolExecutor类-提交、停止
【多线程:线程池】ThreadPoolExecutor类-提交、停止
166 0
C#编程-146:最简单的开启线程
C#编程-146:最简单的开启线程
C#编程-146:最简单的开启线程
|
Java
线程池有哪几种运行状态?
线程池主要的五种运行状态简介
87 0
线程池有哪几种运行状态?

热门文章

最新文章