在日常开发过程中,为了提高应用的处理性能,充分利用计算机的硬件资源,我们经常会使用到多线程。通常情况下,来一个任务就新建一个线程去处理,这种方式简单直接,但存在一些问题:
-
线程的创建和销毁需要一定成本,频繁的创建销毁会造成额外的系统开销
-
线程数量不可控,因为线程数和任务数挂钩,当大量任务蜂拥而至就会创建大量线程,很可能导致系统内存溢出
-
线程的执行本身是基于时间片轮询调度,当线程数量过多,就会频繁的进行上下文切换造成性能损耗,得不偿失
如果一个线程能被复用,在处理完一个任务后继续去处理下一个任务而不是直接被销毁,那问题是不是就迎刃而解了?由此,我们引入了线程池。
1、线程池的创建
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
如上,ThreadPoolExecutor提供了4个构造器方法,查看源码不难发现,实际上最终都调的第四个构造方法,那我们先来理解一下各入参的含义。
corePoolSize:核心线程数大小,核心线程一定程度上可以理解为常驻线程。默认情况下,线程池初始化
Java ThreadPoolExecutor详解:线程池的工作原理与配置

本文详细介绍了Java中的线程池ThreadPoolExecutor的使用,包括线程池的创建、核心线程数、最大线程数、空闲线程存活时间等参数的含义,以及任务提交后的处理流程。同时,还讲解了不同类型的任务队列和拒绝策略,如BlockingQueue的实现类以及它们的特点,以及如何根据业务需求选择合适的策略。
最低0.47元/天 解锁文章
3381

被折叠的 条评论
为什么被折叠?



