关于Java线程池
处理复杂任务时,需要启用多线程来进行加速。
简单的线程池创建:
Executors.newFixedThreadPool
创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待
Executors.newCachedThreadPool
创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程
Executors.newSingleThreadExecutor
创建单个线程数的线程池,它可以保证先进先出的执行顺序
Executors.newScheduledThreadPool
创建一个可以执行延迟任务的线程池
Executors.newSingleThreadScheduledExecutor
创建一个单线程的可以执行延迟任务的线程池
Executors.newWorkStealingPool
创建一个抢占式执行的线程池 JDK 1.8 中添加
ThreadPoolExecutor创建:
参数说明:
corePoolSize 核心线程数
maximumPoolSize 最大线程数
keepAliveTime
最大线程数可以存活的时间,就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间
unit
计算keepAliveTime的单位
workQueue
阻塞(等待)队列。一共有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等7种阻塞队列
threadFactory
创建线程的工厂,主要用来创建线程,默认为正常优先级、非守护线程。
handler
拒绝策略。一共有下面四种:
AbortPolicy
不执行新任务,直接抛出异常,提示线程池已满
DisCardPolicy
不执行新任务,也不抛出异常
DisCardOldSetPolicy
将消息队列中的第一个任务替换为当前新进来的任务执行
CallerRunsPolicy
直接调用execute来执行当前任务
将配置的线程方法添加到spring容器中,供其他类调用:
public Executor getExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(2);
//配置最大线程数
executor.setMaxPoolSize(5);
//配置队列大小
executor.setQueueCapacity(10000);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("async-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//允许线程空闲时间(单位:默认为秒)
executor.setKeepAliveSeconds(60);
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
//执行初始化
executor.initialize();
return executor;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!