news 2026/4/18 1:26:49

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/4/12 0:59:11

Hunyuan-OCR模型微调入门:云端GPU+预置数据集开箱即用

Hunyuan-OCR模型微调入门&#xff1a;云端GPU预置数据集开箱即用 你是不是也遇到过这样的情况&#xff1f;AI培训班马上结业&#xff0c;手头有个OCR识别项目要交&#xff0c;但学校的服务器排队排到下周&#xff0c;本地电脑又跑不动大模型。更头疼的是&#xff0c;你的数据是…

作者头像 李华
网站建设 2026/4/18 0:09:31

解锁AI本地推荐:运用GEO策略,系统性提升你的品牌可见度

在信息获取方式不断迭代的今天&#xff0c;搜索引擎正经历一场深刻变革。曾经&#xff0c;Google等传统搜索引擎凭借链接列表主导信息发现&#xff1b;如今&#xff0c;ChatGPT、Google AI Mode、Copilot、Perplexity等基于大语言模型&#xff08;LLMs&#xff09;的AI工具&…

作者头像 李华
网站建设 2026/4/17 12:33:59

Qwen2.5-7B模型下载:download_model.py脚本使用指南

Qwen2.5-7B模型下载&#xff1a;download_model.py脚本使用指南 1. 引言 1.1 业务场景描述 随着大语言模型在实际应用中的广泛落地&#xff0c;快速、稳定地获取预训练模型权重成为开发和部署的关键环节。通义千问Qwen2.5系列作为最新一代高性能语言模型&#xff0c;已在多个…

作者头像 李华
网站建设 2026/4/16 1:16:15

IndexTTS-2-LLM启动慢?scipy依赖优化提速实战案例

IndexTTS-2-LLM启动慢&#xff1f;scipy依赖优化提速实战案例 1. 背景与问题定位 在部署基于 kusururi/IndexTTS-2-LLM 的智能语音合成服务时&#xff0c;尽管系统具备出色的语音自然度和情感表达能力&#xff0c;但在实际使用中&#xff0c;不少用户反馈服务首次启动耗时过长…

作者头像 李华
网站建设 2026/4/17 20:22:23

GPT-OSS推理超时处理:异常捕获与重试机制

GPT-OSS推理超时处理&#xff1a;异常捕获与重试机制 1. 背景与问题定义 随着大模型在实际生产环境中的广泛应用&#xff0c;推理服务的稳定性成为影响用户体验的关键因素。GPT-OSS 是 OpenAI 近期开源的一系列大语言模型之一&#xff0c;其中 gpt-oss-20b-WEBUI 版本专为 We…

作者头像 李华
网站建设 2026/4/16 22:43:00

如何用AI生成高质量古典乐?试试NotaGen大模型镜像

如何用AI生成高质量古典乐&#xff1f;试试NotaGen大模型镜像 1. 引言&#xff1a;AI音乐生成的新范式 在人工智能技术飞速发展的今天&#xff0c;音乐创作这一传统上依赖人类灵感与技巧的领域也迎来了革命性变革。尤其是基于大型语言模型&#xff08;LLM&#xff09;架构的符…

作者头像 李华