关于线程池的学习

线程池

为什么要引入线程池

  1. 降低资源消耗 复用线程:频繁创建和销毁线程会消耗大量系统资源(如内存、CPU)。线程池通过复用已创建的线程,减少线程生命周期带来的开销。减少上下文切换:线程过多会导致CPU频繁切换线程上下文,线程池通过控制线程数量,降低切换频 率。提高线程池的复用性

  2. 提高响应速度 任务即时处理:当任务到达时,线程池中通常已有空闲线程可直接执行任务,无需等待新线程创建,缩短任务延迟。

  3. 控制并发规模 限制线程数量:通过设置核心线程数、最大线程数,防止无限制创建线程导致系统资源耗尽(如内存溢出)。流量削峰:突发大量任务时,队列缓存任务,线程池按配置逐步处理,避免瞬间高并发压垮系统。

  4. 统一管理与监控 生命周期管理:线程池自动维护线程的创建、回收(如超时空闲线程销毁),简化开发。任务队列机制:支持多种队列(如无界队列、有界队列、优先级队列),灵活应对不同场景需求。统计与监控:可跟踪任务完成数、活动线程数等指标,便于优化和排查问题。

  5. 增强稳定性 拒绝策略:当任务超出队列容量且线程数达上限时,提供拒绝策略(如丢弃、抛异常、调用者执行等),避免系统崩溃。异常处理:支持自定义异常处理逻辑(如记录日志、重试),防止任务失败导致线程终止。

基于SpringBoot的线程池的引入

js
复制代码
package com.niki.mallchat.common.common.config; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.ThreadPoolExecutor; /** * @author niki * @date 2023/5/23 16:39 * @Description: 同一线程池的管理 */ @Slf4j @Configuration @EnableAsync public class ThreadPoolConfig { @Qualifier("threadPoolTaskExecutor") public ThreadPoolTaskExecutor threadPoolTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 设置核心线程数 executor.setCorePoolSize(10); // 设置最大线程数 executor.setMaxPoolSize(16); // 设置队列容量 executor.setQueueCapacity(200); // 设置线程池前缀 executor.setThreadNamePrefix("mallchat-executor-"); // 设置拒绝策略为CallerRunsPolicy executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 设置优雅停机,等待任务完成 executor.setWaitForTasksToCompleteOnShutdown(true); //设置等待的时间为60S executor.setAwaitTerminationSeconds(60); executor.initialize(); return executor; } }

为了防止服务停机或者线程池停止导致当前的任务未执行 设置了setWaitForTasksToCompleteOnShutdown这个参数 默认为false image.png 这个类实现了DisposableBean的方法 并且重写了shutDown方法 image.png

我们在我们需要的地方打上**@Async这个注解并且指定Bean的名称**就可以使用当前线程池提高的线程执行异步化

结尾

实现异步的方式还有很多 比如使用Java1.8并发包中的CompletableFuture等等

js
复制代码
import java.util.concurrent.CompletableFuture; public class CompletableFutureExample { public static void main(String[] args) { CompletableFuture.supplyAsync(() -> { // 第一个任务 return "Hello"; }).thenApplyAsync(result -> { // 第二个任务,依赖第一个任务的结果 return result + ", CompletableFuture!"; }).thenAcceptAsync(finalResult -> { // 消费最终结果 System.out.println(finalResult); // 输出: Hello, CompletableFuture! }).join(); // 等待任务完成 } }
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP