2023-2更文3-newCachedThreadPool

118 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

newCachedThreadPool

前文

newCachedThreadPool是jdk中所提供的四种默认线程池之一,主要特点与其他几种线程池不同,会根据实际的线程使用情况进行线程的回收会线程的额外新建操作。

线程池使用方法

ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(() -> {
    System.out.println(Thread.currentThread().getName());
});

当我们需要新建cachedThreadPool时,我们可以直接通过jdk所提供的executors接口直接进行创建。创建线程池后,当需要在新的线程中进行程序的执行,可以直接通过execute方法进行实际程序逻辑的执行,也与其他类型线程池的执行方式一致。而不同之处在于,当我们创建该类型线程池时,线程池创建的某些属性有所不同,包括但不限于线程的常驻核心数为0,线程的最大核心数为最大值,线程的空闲等待时间及单位为60秒,当线程达到上限的等待队列为SynchronousQueue。也正是如上的一些定制化参数,保证了当需要线程时会按照需求自动进行线程的创建,并无上限的要求。

ublic static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

线程池的一些原理

该类型线程池所采用的线程等待队列不是常规类型的队列,可以进行队列中元素的任意增删,而是采用了SynchronousQueue作为任务等待队列。该队列的一大特点是同步阻塞,必须移除一个元素才能添加进一个元素,也就是队列中至多保持只有一个元素。也就是这个特性,每次当需要新建线程时,首先会先进入同步队列之中。此后会由线程池创建新的线程后,后续的线程任务才可进入队列。因此该线程池也不像其他线程池指定线程上限,而是线程数目无上限,根据实际计算机的性能创建,同时默认设置1分钟的线程释放时间。当任务结束后1分钟线程会被释放掉,回收空闲线程。因此在使用时需要注意,保证不要出现线程过多占用系统资源的情况。该类型的线程池适合处理任务周期短的任务,频繁的进行线程回收。

总结

本文主要是关于缓存线程池的一些基本介绍,在某些场景中比较适用,但要注意不要导致系统资源全部消耗。