ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【并发编程】线程池是否需要手动关闭吗?以Hutool中的线程池为例

2020-04-23 11:01:05  阅读:438  来源: 互联网

标签:池为例 int Hutool private final static 线程 public


Hutool工具包中使用线程池的API是:

  ThreadUtil.execute()

    /**
     * 直接在公共线程池中执行线程
     *
     * @param runnable 可运行对象
     */
    public static void execute(Runnable runnable) {
        GlobalThreadPool.execute(runnable);
    }

  内部使用的一个名为 GlobalThreadPool的线程池,该线程池使用ExecutorBuilder建造者模式去创建,其线程池的默认参数如下:

public class GlobalThreadPool {
    private static ExecutorService executor;

    private GlobalThreadPool() {
    }

    static {
        init();
    }

    /**
     * 初始化全局线程池
     */
    synchronized public static void init() {
        if (null != executor) {
            executor.shutdownNow();
        }
        executor = ExecutorBuilder.create().useSynchronousQueue().build();
    }
    private static final long serialVersionUID = 1L;

    /** 默认的等待队列容量 */
    public static final int DEFAULT_QUEUE_CAPACITY = 1024;

    /**
     * 初始池大小
     */
    private int corePoolSize;
    /**
     * 最大池大小(允许同时执行的最大线程数)
     */
    private int maxPoolSize = Integer.MAX_VALUE;
    /**
     * 线程存活时间,即当池中线程多于初始大小时,多出的线程保留的时长
     */
    private long keepAliveTime = TimeUnit.SECONDS.toNanos(60);
    /**
     * 队列,用于存在未执行的线程
     */
    private BlockingQueue<Runnable> workQueue;
    /**
     * 线程工厂,用于自定义线程创建
     */
    private ThreadFactory threadFactory;
    /**
     * 当线程阻塞(block)时的异常处理器,所谓线程阻塞即线程池和等待队列已满,无法处理线程时采取的策略
     */
    private RejectedExecutionHandler handler;
    /**
     * 线程执行超时后是否回收线程
     */
    private Boolean allowCoreThreadTimeOut;

  可以看到其corePoolSize线程数是0,最大线程数是Integer.max_value,也就是21亿,线程最大存活时间为60s,下面为测试Demo

public class Test {

    public static void main(String[] args) throws Exception {
        final AtomicReference<BigDecimal> REFERENCE = new AtomicReference<>();
        final AtomicInteger atomicInteger =new AtomicInteger();
        CountDownLatch countDownLatch = ThreadUtil.newCountDownLatch(500);
        for (int i = 0; i < 500; i++) {
            final int a = i;
            ThreadUtil.execute(() -> {
                atomicInteger.incrementAndGet();
                System.out.println("线程" + a);
                REFERENCE.set(BigDecimal.valueOf(a));
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        System.out.println("===== Atomic ====="+atomicInteger.get());
        System.out.println("=====SUCCEED=====" + REFERENCE.get());

    }
}

  测试demo可以看到主线程执行完毕后,程序并不会中止,因为子线程仍然存活,60s后程序终止;

因此这里有个结论:

  1.线程池corePoolSize为0,且最大线程数设置为存活时间,则可以不用关闭线程池,特别是在请求比较密集的情况下,能更好的减少创建线程所需要的时间

  2.如果核心线程数较多,且最大线程数的存活时间较长,请求量不大,则可以手动关闭线程池,减少线程长期存在的性能损耗;

 

标签:池为例,int,Hutool,private,final,static,线程,public
来源: https://www.cnblogs.com/july-sunny/p/12759265.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有