我是靠谱客的博主 执着西装,最近开发中收集的这篇文章主要介绍vb.net 线程偶尔不会自动关闭_线程池优雅关闭,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

d572dd53daa29780d3dbada4dc5bac18.png

第一种方法

首先看下源码注释:

  • 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 退出,但这样做有问题,如果有还未执行完的任务就会出现异常了,(任务还没执行完就退出)

aead92528ae95f00a7e953f6a277226f.png

关注公众号 获取更多精彩内容

最后

以上就是执着西装为你收集整理的vb.net 线程偶尔不会自动关闭_线程池优雅关闭的全部内容,希望文章能够帮你解决vb.net 线程偶尔不会自动关闭_线程池优雅关闭所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部