news 2026/8/29 5:53:52

Java-线程池(八股)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java-线程池(八股)

创建方法:Java原生创建线程池与Spring创建线程池

Java原生创建线程池:

一、手动创建ThreadPollExecutor

// Java原生线程池核心构造方法 ThreadPoolExecutor threadPool = new ThreadPoolExecutor( int corePoolSize, // 核心参数1:核心线程数(常驻线程数) int maximumPoolSize, // 核心参数2:最大线程数(线程池能创建的最大线程数) long keepAliveTime, // 核心参数3:空闲线程存活时间 TimeUnit unit, // 核心参数4:存活时间的单位(秒/毫秒等) BlockingQueue<Runnable> workQueue, // 核心参数5:任务阻塞队列(核心线程满了放这里) ThreadFactory threadFactory, // 核心参数6:线程工厂(自定义线程名称、优先级等) RejectedExecutionHandler handler // 核心参数7:拒绝策略(队列满+线程满时的处理方式) );

二、Spring创建线程池

核心类是ThreadPoolTaskExecutor。

纯注解方式(@Configuration+@Bean,SpringBoot首选)

代码示例:

步骤一:编写线程类的核心配置类:
@Configuration public class SpringThreadPoolConfig { @Bean("customThreadPool") public Executor customThreadPool() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(2); executor.setMaxPoolSize(5); executor.setQueueCapacity(10); executor.setKeepAliveSeconds(30); executor.setThreadNamePrefix("SPRING-THREAD-POOL-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 初始化线程池(必须调用,否则线程池不生效) executor.initialize(); return executor; } }
步骤二:业务代码中注入并使用线程池
@Service public class ThreadPoolService { // 注入线程池:@Qualifier指定Bean的名称,避免多个线程池时注入失败 @Autowired @Qualifier("customThreadPool") private Executor customThreadPool; // 业务方法中执行异步任务 public void doAsyncTask() { for (int i = 1; i <= 5; i++) { int finalI = i; customThreadPool.execute(() -> { System.out.println(Thread.currentThread().getName() + " 执行异步任务:" + finalI); try { Thread.sleep(1000); } catch (InterruptedException e) {e.printStackTrace();} }); } } }

三、Spring线程池(@Async异步注解)

步骤1:在配置类上添加@EnbaleAsync注解(开启异步支持)
@Configuration @EnableAsync public class SpringThreadPoolConfig { @Bean("customThreadPool") public Executor customThreadPool() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(2); executor.setMaxPoolSize(5); executor.setQueueCapacity(10); executor.setKeepAliveSeconds(30); executor.setThreadNamePrefix("SPRING-THREAD-POOL-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } }
步骤2:在业务方法上添加@Async(线程池Bean名)注解
@Service public class AsyncTaskService { /** * 被@Async注解的方法,会被自动提交到指定的线程池异步执行 * 无需手动调用线程池,Spring自动处理,无感知! */ @Async("customThreadPool") public void doAsyncTask(int taskId) { System.out.println(Thread.currentThread().getName() + " 执行异步任务:" + taskId); try { Thread.sleep(1000); } catch (InterruptedException e) {e.printStackTrace();} } }
步骤3:调用该方法即可(同步调用,异步执行)
@Controller public class TaskController { @Autowired private AsyncTaskService asyncTaskService; @GetMapping("/task") public String doTask() { for (int i = 1; i <= 5; i++) { // 同步调用,但方法内部会异步执行 asyncTaskService.doAsyncTask(i); } return "success"; } }

线程池的种类:

1、newCachedThreadPool

创建一个可缓存线程池,如果当前线程池的长度超过了处理的需要时,它可以灵活的回收空闲的线程。当需要增加的时候,可以灵活的添加新的线程,不会对线程的长度做出任何限制。

2、newFixedThreadPool

创建一个定长线程池,可以控制线程最大并发数,超出的线程会在队列中等待。

3、newScheduledThreadPool

创建一个固定长度的线程池,支持定时的以及周期性的任务执行

4、newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,如果这个唯一的线程因为异常结束,那么会有一个新的线程来代替它,它保证前一项任务执行完毕后才执行后一项。保证所有任务按照指定顺序执行。

线程池的拒绝策略:

AbortPolicy,默认

线程池的默认拒绝策略,如果线程池满了丢掉这个任务并且抛出RejectedExecutionExcepitio异常

DiscardPolicy

是AbortPolicy的silent版本,如果线程池队列满了,会直接丢掉这个任务并且不会有任何异常。

DiscardOldestPolicy

丢弃最老的。如果队列满了,会将最早进入队列的任务删掉腾出空间,再尝试加入队列。

CallerRunsPolicy

如果添加到线程池失败,那么调用线程会自己去执行该任务,不会等待线程池中的线程去执行。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/23 19:03:18

汽车维修:技师诊断过程语音记录与知识沉淀

汽车维修&#xff1a;技师诊断过程语音记录与知识沉淀 在汽车后市场服务中&#xff0c;维修技师的经验是企业最宝贵的无形资产。然而&#xff0c;这些经验往往依赖于口耳相传或零散的纸质记录&#xff0c;难以系统化沉淀和复用。随着人工智能技术的发展&#xff0c;尤其是离线…

作者头像 李华
网站建设 2026/8/25 9:30:39

AI智能文档扫描仪技术栈解析:OpenCV几何变换应用实例

AI智能文档扫描仪技术栈解析&#xff1a;OpenCV几何变换应用实例 1. 技术背景与应用场景 在移动办公和数字化管理日益普及的今天&#xff0c;将纸质文档快速转化为高质量电子文件成为高频需求。传统扫描仪依赖专用硬件&#xff0c;而手机拍照虽便捷却存在角度倾斜、透视畸变、…

作者头像 李华
网站建设 2026/8/26 5:54:29

快速迭代:如何用云端环境加速DCT-Net产品开发周期

快速迭代&#xff1a;如何用云端环境加速DCT-Net产品开发周期 你是否也遇到过这样的情况&#xff1f;团队正在全力推进AI卡通化功能的版本更新&#xff0c;结果每次新成员加入或测试环境重建时&#xff0c;都要花上半天甚至一整天去配置Python环境、安装CUDA驱动、调试PyTorch…

作者头像 李华
网站建设 2026/8/19 17:40:54

快速搭建语音机器人:IndexTTS-2-LLM集成实践教程

快速搭建语音机器人&#xff1a;IndexTTS-2-LLM集成实践教程 1. 引言 随着人工智能技术的不断演进&#xff0c;语音合成&#xff08;Text-to-Speech, TTS&#xff09;已从机械朗读迈向自然拟人化表达。在众多新兴方案中&#xff0c;IndexTTS-2-LLM 凭借其融合大语言模型&…

作者头像 李华
网站建设 2026/8/24 11:01:33

Open-AutoGLM性能调优:max-model-len参数设置建议

Open-AutoGLM性能调优&#xff1a;max-model-len参数设置建议 1. 背景与问题引入 Open-AutoGLM 是智谱开源的手机端 AI Agent 框架&#xff0c;基于 AutoGLM 构建&#xff0c;旨在实现自然语言驱动的移动端自动化操作。该系统通过视觉语言模型理解手机屏幕内容&#xff0c;结…

作者头像 李华
网站建设 2026/8/24 7:34:24

AI读脸术自动化测试:构建回归测试集验证模型稳定性

AI读脸术自动化测试&#xff1a;构建回归测试集验证模型稳定性 1. 引言 随着AI视觉技术在身份识别、智能安防、用户画像等场景的广泛应用&#xff0c;人脸属性分析作为基础能力之一&#xff0c;其准确性和稳定性直接影响上层应用的表现。特别是在模型迭代或部署环境变更时&am…

作者头像 李华