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

Spring 管理线程并实现Runnable接口的任务

1. 定义 Runnable 任务类

将 CheckWorker 声明为 Spring Bean(注意作用域),并实现 Runnable 接口:

@Component
@Scope("prototype") // 原型作用域,避免单例线程安全问题
public class CheckWorker implements Runnable {
    private final SomeService someService; // 可注入其他依赖

    @Autowired
    public CheckWorker(SomeService someService) {
        this.someService = someService;
    }

    @Override
    public void run() {
        try {
            // 执行具体的检查逻辑
            someService.performCheck();
        } catch (Exception e) {
            // 异常处理
            Logger.error("CheckWorker执行失败", e);
        }
    }
}

2. 配置线程池(TaskExecutor)

在 Spring 配置类中定义线程池 Bean,优化资源管理:

@Configuration
@EnableAsync // 启用异步支持(可选,根据需求)
public class ThreadPoolConfig {

    @Bean("taskExecutor")
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数(根据机器CPU核心数调整)
        executor.setCorePoolSize(4);
        // 最大线程数
        executor.setMaxPoolSize(8);
        // 队列容量(防止内存溢出)
        executor.setQueueCapacity(100);
        // 线程名前缀
        executor.setThreadNamePrefix("CheckWorker-Thread-");
        // 拒绝策略(CallerRunsPolicy:由调用线程处理该任务)
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 线程空闲后的存活时间(秒)
        executor.setKeepAliveSeconds(60);
        // 初始化
        executor.initialize();
        return executor;
    }
}

3. 提交任务到线程池

通过注入 TaskExecutor 提交 CheckWorker 任务:

方式1:手动提交任务
@Service
public class CheckService {
    private final TaskExecutor taskExecutor;
    private final CheckWorker checkWorker;

    @Autowired
    public CheckService(
        @Qualifier("taskExecutor") TaskExecutor taskExecutor,
        CheckWorker checkWorker
    ) {
        this.taskExecutor = taskExecutor;
        this.checkWorker = checkWorker;
    }

    // 触发任务执行
    public void startCheck() {
        taskExecutor.execute(checkWorker);
        // 如果需要多次执行,应使用原型Bean获取新实例
        // CheckWorker newWorker = applicationContext.getBean(CheckWorker.class);
        // taskExecutor.execute(newWorker);
    }
}

方式2:使用 @Async 注解(需配合 @EnableAsync)

修改 CheckWorker 直接使用异步执行:

@Service
public class CheckService {
    @Autowired
    private CheckWorker checkWorker;

    @Async("taskExecutor") // 指定线程池
    public void asyncStartCheck() {
        checkWorker.run();
    }
}

4. 线程池监控与调优

监控指标
  • 活跃线程数ThreadPoolTaskExecutor.getActiveCount()

  • 队列剩余容量ThreadPoolTaskExecutor.getThreadPoolExecutor().getQueue().remainingCapacity()

  • 已完成任务数ThreadPoolTaskExecutor.getThreadPoolExecutor().getCompletedTaskCount()

调优建议
  • 核心/最大线程数:根据业务负载和 CPU 核心数动态调整。

  • 队列类型:默认使用 LinkedBlockingQueue,高吞吐场景可换为 SynchronousQueue

  • 拒绝策略

    • AbortPolicy(默认):直接抛出异常。

    • DiscardPolicy:静默丢弃任务。

    • DiscardOldestPolicy:丢弃队列中最旧的任务。

    • CallerRunsPolicy:由调用线程执行任务。

相关文章:

  • Zabbix实践教程: ssl证书有效期监控
  • Python 常用标准库功能与用法指南
  • Linux dma的使用与理解
  • 【PPO】小白的强化学习算法笔记
  • 一文讲清楚Python中函数和类区别和联系
  • 【更新中】【React】基础版React + Redux实现教程,自定义redux库和react-redux库
  • 【vue】vue + vant实现上传图片添加水印
  • 25、web前端开发之CSS3(二)
  • 1.6 循环嵌套
  • USB总线示波器采集卡--2 通道,10G采样
  • DML 数据操纵语言学习笔记
  • 【NLP 48、大语言模型的神秘力量 —— ICL:in context learning】
  • ffmpeg-将多个视频切片成一个新的视频
  • 智能化集成管理系统的核心特点与发展趋势
  • 26考研——树与二叉树_树与二叉树的应用(5)
  • redux ,react-redux,redux-toolkit 简单总结
  • C# 多标签浏览器 谷歌内核Csharp
  • Vue中使用JsonView进行JSON数据展示
  • element-ui messageBox 组件源码分享
  • Vue.js 完全指南:从入门到精通
  • 上海大型网站建设/搜索引擎公司排名
  • 有什么平台做网站比较好/全网营销软件
  • 柳州做网站哪家好/免费舆情网站
  • 怎样做一元购网站/手机百度seo怎么优化
  • 网站开发做前端还是后端/长沙网站推广 下拉通推广
  • 怎么查网站是那个公司做的/百度网盘网页