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

 

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

  1. 《Java并发编程实战》笔记-取消与关闭

    1,中断是实现取消的最合理方式.2,对中断操作的正确理解是:它并不会真正地中断一个正在运行的线程,而只是发出中断请求,然后由线程在下一个合适的时刻中断自己.3,区分任务和线程对中断的反应是很重要的4, ...

  2. 并发王者课 - 青铜 2:峡谷笔记 - 简单认识Java中的线程

    在前面的<兵分三路:如何创建多线程>文章中,我们已经通过Thread和Runnable直观地了解如何在Java中创建一个线程,相信你已经有了一定的体感.在本篇文章中,我们将基于前面的示例代 ...

  3. Java并发编程实战(chapter_2)(对象发布、不变性、设计线程安全类)

    一.发布与溢出 "发布(Publish)"一个对象的意思是指,使对象能够在当前作用于之外的代码中使用.这个"之外",尤为关键,各种出问题的地方,都是因为这个&q ...

  4. (并发编程)全局解释器锁(GIL)-----有了GIL不用给线程加锁了?

    一.全局解释器锁 (GIL)运行test.py的流程:a.将python解释器的代码从硬盘读入内存b.将test.py的代码从硬盘读入内存  (一个进程内装有两份代码---一份cpython解释器代码 ...

  5. 《java学习三》并发编程 -------线程池原理剖析

    阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到 ...

  6. Java并发编程笔记4-线程池

    我们使用线程的时候就去创建一个线程,但是就会有一个问题: 如果并发的线程数量非常多,而且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会导致大大降低系统的效率,因为频繁创建线程和销毁线 ...

  7. Java并发编程:线程和锁的使用与解析

    线程的使用  新建线程 新建一个线程有两种方法:继承Thread类,然后重写run方法:实现Runnable接口,然后实现run方法.实际上Thread类也是实现的Runnable接口,再加上类只能单 ...

  8. java并发编程实战笔记---(第二章)线程安全:正确性

    ThreadA__________     同步 ______________ 异步 ___________     异步 ThreadB__________         ____________ ...

  9. Java并发编程有多难?这几个核心技术你掌握了吗?

    本文主要内容索引 1.Java线程 2.线程模型 3.Java线程池 4.Future(各种Future) 5.Fork/Join框架 6.volatile 7.CAS(原子操作) 8.AQS(并发同 ...

随机推荐

  1. 在C#的WPF程序使用XAML实现画线

    在WPF中画直线.新建WPF应用程序,使用XAML画直线.使用X1.Y1两个属性可以设置直线的起点坐标,X2.Y2两个属性则可以设置直线的终点坐标.控制起点/终点坐标就可以实现平行.交错等效果.Str ...

  2. springboot源码解析-管中窥豹系列之自动装配(九)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  3. 【知识点】 gcc和g++的联系和区别

    目前(2020-09)GCC 编译器已经更新至 10.2版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C++ . 除此之外,当下的 GCC 编译器还支持编译 Go.O ...

  4. 微信小程序onReachBottom第二次失效

    当整个页面就是一个view包着一个轮播.一个横向scroll-view和一个纵向scroll-view onReachBottom方法只执行一次 解决方法:

  5. 剑指 Offer 14- II. 剪绳子 II + 贪心 + 数论 + 快速幂

    剑指 Offer 14- II. 剪绳子 II 题目链接 因为有取模的操作,动态规划中max不能用了,我们观察:正整数从1开始,但是1不能拆分成两个正整数之和,所以不能当输入. 2只能拆成 1+1,所 ...

  6. Centos7网络配置——设置固定ip

    有段时间没有用虚拟机了,这几天翻出了以前的虚拟机,写几个demo,但遇到了一个让人难受的问题.使用xshell远程连接虚拟机,命令还没敲几个,不到一分钟就自动断开了,只能重新再次连接.啥事都干不成,有 ...

  7. MySql历史与架构

    MySQL 逻辑架构

  8. reverseLinkedList(翻转链表)

    ReverseLinkedList(翻转链表) 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.非连续.非顺序指的是,通过指针把一组零散的内存块串 ...

  9. linux程序开机自动启动

    linux如果需要实现开机启动, 可以找到 $HOME/.config/autostart 目录(没有的话新建一个),在该文件夹下创建一个空文件,文件名自拟,后缀必须是desktop,如:dingda ...

  10. OMnet++ 初学者教程 第一节 入门

    第1部分-入门 1.1模型 首先,让我们从一个包含两个节点的"network"开始.节点将做一些简单的事情:一个是节点将创建一个数据包,而两个节点将继续来回传递相同的数据包.我们将 ...