当前位置: 首页 > news >正文

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

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

http://www.jsqmd.com/news/245829/

相关文章:

  • Python3.10生物信息学:云端处理基因数据,隐私有保障
  • STM32波形发生器设计:ADC反馈控制应用
  • 5个AI图像增强工具对比测评:Super Resolution镜像免配置推荐
  • Vllm-v0.11.0避坑指南:云端自动配环境,避开CUDA版本冲突
  • Hunyuan-OCR模型微调入门:云端GPU+预置数据集开箱即用
  • VibeThinker-1.5B显存不足?轻量模型GPU适配优化部署教程
  • 基于sbit的多设备状态监控程序设计指南
  • 如何提升语音清晰度?FRCRN语音降噪镜像快速上手指南
  • Qwen3-1.7B enable_thinking参数使用详解
  • 麦橘超然工业设计案例:产品原型AI渲染方案
  • BGE-Reranker-v2-m3实战教程:RAG系统检索精度提升保姆级指南
  • AI读脸术环境配置太复杂?试试这个免安装网页版,GPU云端调用
  • AI赋能全流程,重塑需求管理新生态——Visual RM需求数智化平台核心能力解析
  • 看完就想试!Live Avatar生成的数字人视频太逼真了
  • Qwen3-1.7B镜像更新日志解读:新特性与兼容性说明
  • Open Interpreter错误回环机制:Qwen3-4B自动修正代码部署案例
  • 开源项目推荐:CH340驱动源码下载与使用说明
  • VibeThinker-1.5B代码补全:云端VS Code方案5分钟上手
  • VibeThinker-1.5B优化建议:提升代码生成准确率
  • Qwen3-VL跨平台方案:Windows/Mac/Linux全兼容
  • 手把手教你用Proteus进行PIC单片机仿真
  • Qwen3-Embedding-0.6B省钱技巧:按需GPU资源部署实战案例
  • LobeChat智能家居控制:语音指令联动IoT设备实现
  • Qwen3-4B如何快速调用API?Python集成部署教程详解
  • HY-MT1.5-7B最佳实践:这样用云端GPU性价比最高
  • MinerU如何集成到项目?API接口调用详细步骤
  • HY-MT1.5-7B翻译大模型深度应用|附vllm服务部署与调用示例
  • Origin科研绘图——3D散点图
  • YOLOv13输入分辨率怎么选?640×640最实用
  • web安全信息收集技巧+工具汇总