线程池优雅关闭

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

第一种方法


首先看下源码注释:


  • 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掉?我们能否监听关闭事件进行补偿?
2759 1
如何优雅的关闭线程池?
|
4月前
|
监控 Java
线程池大小如何设置
在并发编程中,线程池是一个非常重要的组件,它不仅能够提高程序的响应速度,还能有效地利用系统资源。合理设置线程池的大小对于优化系统性能至关重要。本文将探讨如何根据应用场景和系统资源来设置线程池的大小。
|
7月前
|
监控 Java
ThreadPoolExecutor 线程执行超时,释放线程
ThreadPoolExecutor 线程执行超时,释放线程
212 1
|
Java 数据库连接
【线程池使用完毕为何必须shutdown】
【线程池使用完毕为何必须shutdown】
287 0
|
Java 调度
线程池如何知道一个线程的任务已经执行完成
线程池如何知道一个线程的任务已经执行完成
616 0
|
10月前
|
存储 Java
什么是线程池,线程池的状态,线程池的用法示例
什么是线程池,线程池的状态,线程池的用法示例
|
Java
面试官:说一下线程池的状态以及线程池中空闲的线程的状态
面试官:说一下线程池的状态以及线程池中空闲的线程的状态
1330 0
|
Java API
高并发编程-Thread_正确关闭线程的三种方式
高并发编程-Thread_正确关闭线程的三种方式
269 0
|
监控 安全 Java
关闭线程的正确方法:“优雅”的中断
前文从任务到线程:Java结构化并发应用程序中介绍了如何安排任务启动线程。 线程在启动之后,正常的情况下会运行到任务完成,但是有的情况下会需要提前结束任务,如用户取消操作等。
1421 0
|
Java 调度
Java多线程 关闭线程池 shutdown() 、shutdownNow()、awaitTermination()
Java多线程 关闭线程池 shutdown() 、shutdownNow()、awaitTermination()
328 0
Java多线程 关闭线程池 shutdown() 、shutdownNow()、awaitTermination()