线程池ThreadPoolExecutor
构造方法
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
参数意义:
coreProolSize:线程池核心线程数
maximumPoolSize:线程池所能容纳的最大线程数
keepAliveTime:非核心线程闲置时的超时时长,超过这个时长,非核心线程就会被回收。当ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true时,keepAliveTime同样会作用于核心线程
unit:用于指定keepAliveTime参数的时间单位,常用的有毫秒、秒、分钟
workQueue:线程池中的任务队列,通过线程池的execute方法提交的Runnable对象会存储在这个参数中
threadFactory:线程工厂,为线程池提供创建新线程的功能,是一个接口,只有一个方法:Thread newThread(Runnable r)
遵循规则:
1)如果线程池中的线程数量未达到核心线程的数量,那么会直接启动一个核心线程来执行任务
2)如果线程池中的线程数量已经达到或者超过核心线程的数量,那么任务会被插入到任务队列中排队等待执行
3)如果在步骤2中无法将任务插入到任务队列中,这往往是由于任务队列已满,这个时候如果线程数量未达到线程池规定的最大值,那么会立刻启动一个非核心线程来执行任务
4)如果步骤3中线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务,ThreadPoolExecutor会调用RejectedExecutionHandler的rejectedExecution方法来通知调用者(当任务队列已满或无法成功执行任务时调用)
AsyncTask的配置如下
1)核心线程数=CPU核心数+1
2)线程池最大线程数=CPU核心数的2倍+1
3)核心线程无超时机制,非核心线程在闲置时的超时时间为1秒
4)任务队列的容量为128
线程池分类:
1)FixedThreadPool
public static ExecutorService newFixedThreadPool(int nThread){ return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
线程数量固定的线程池,只有核心线程,没有超时机制,不会被回收,任务队列没有大小限制
2)CachedThreadPool
public static ExecutorService newCachedThreadPool(){ return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60l, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
只有非核心线程,最大线程数为任意大,超时机制为60秒,任务队列相当于一个空集合。此类线程适合执行大量的耗时较少的任务
3)ScheduleThreadPool
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize){ return new ScheduledThreadPoolExecutor(corePoolSize); } public ScheduledThreadPoolExecutor(int corePoolSize){ super(corePoolSize,Integer.MAX_VALUE,0,NANOSECONDS,new DelayedWorkQueue()) }
核心线程数量固定,非核心线程数量没有限制,且超时机制为0,即立刻回收。此类线程主要用于执行定时任务和具有固定周期的重复任务。
4)SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor(){ return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }
内部只有一个核心线程,确保所有任务在同一个线程中按顺序执行。意义在于统一所有的外界任务到一个线程中,使得不需要处理线程同步的问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现