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

Spring 通过多种方式实现使用线程

示例:Spring 中实现 Runnable

import org.springframework.stereotype.Component;

@Component
public class MyRunnable implements Runnable {

    @Override
    public void run() {
        // 在这里定义线程要执行的任务
        System.out.println("线程正在运行: " + Thread.currentThread().getName());
        try {
            Thread.sleep(1000); // 模拟任务执行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程执行完成: " + Thread.currentThread().getName());
    }
}

在 Spring 中启动线程

方法 1:直接启动线程
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TaskService {

    @Autowired
    private MyRunnable myRunnable;

    public void startTask() {
        // 启动线程
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

方法 2:使用 Spring 的 TaskExecutor

Spring 提供了 TaskExecutor 接口,用于更灵活地管理线程池。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.core.task.TaskExecutor;

@Service
public class TaskService {

    @Autowired
    private TaskExecutor taskExecutor;

    @Autowired
    private MyRunnable myRunnable;

    public void startTask() {
        // 使用 TaskExecutor 启动线程
        taskExecutor.execute(myRunnable);
    }
}

配置线程池(可选)

如果你使用 TaskExecutor,可以在 Spring 配置类中定义一个线程池:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@Configuration
public class ThreadPoolConfig {

    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 核心线程数
        executor.setMaxPoolSize(10); // 最大线程数
        executor.setQueueCapacity(25); // 队列容量
        executor.setThreadNamePrefix("MyThread-"); // 线程名称前缀
        executor.initialize();
        return executor;
    }
}

测试代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class AppRunner implements CommandLineRunner {

    @Autowired
    private TaskService taskService;

    @Override
    public void run(String... args) throws Exception {
        // 启动任务
        taskService.startTask();
    }
}

运行结果

当你运行 Spring Boot 应用程序时,控制台会输出类似以下内容:

线程正在运行: MyThread-1
线程执行完成: MyThread-1

总结

  1. 实现 Runnable 接口:定义线程的任务逻辑。

  2. 启动线程:可以通过 new Thread() 或 Spring 的 TaskExecutor 启动线程。

  3. 线程池配置:使用 ThreadPoolTaskExecutor 配置线程池,提高线程管理的灵活性。

http://www.dtcms.com/a/99586.html

相关文章:

  • 在用redis当中可能遇到的问题解决方案以及redis中的一些名词解释
  • HTML 标签类型全面介绍
  • docker-compese 启动mysql8.0.36与phpmyadmin,并使用web连接数据库
  • Reactive编程:数据流和观察者
  • MySQL多表查询实验
  • c++-引用
  • 【STM32】WDG看门狗(学习笔记)
  • 积分赛——串口控制指示灯
  • MySQL排序详解
  • vue3 响应式系统指南
  • 无人机中继传输数据链技术,(无人机+自组网)远距离传输技术实现详解
  • 大唐杯02 DTM.PX4.016
  • 企业级知识库建设:自建与开源产品集成的全景解析 —— 产品经理、CTO 与 CDO 的深度对话
  • Python基础知识第二天:从格式化到流程控制
  • VSCode Java 单元测试没有运行按钮
  • 代码随想录day2 数组总结
  • 03-SpringBoot3入门-配置文件(自定义配置及读取)
  • Centos 7 搭建 jumpserver 堡垒机
  • Nginx 解决具有不安全、不正确或缺少 SameSite 属性的 Cookie方案
  • IPD流程:科技企业IPD流程培训稿
  • 独立站系统:架构设计、功能实现与用户界面优化
  • 【项目合集】只能xx养殖系统,STM32、esp8266、OLED屏幕、dht11、光敏、水位、加热、风扇
  • STL性能优化实战:如何让C++程序畅快运行
  • 从代码学习数值优化算法 - 分片McCormick放松方法Python版
  • 如何使用postman调用多参数接口(包含文件上传)
  • C++ 中std::vector<T>清除方式
  • win32汇编环境,网络编程入门之十六
  • Reidis介绍
  • 收集的一些问题?
  • SolidJS 深度解析:高性能响应式前端框架