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

JAVA-Spring Boot多线程

方式特点适用场景
ExecutorServiceJava 原生 API,灵活性高,适合需要完全控制线程池的场景。通用多线程任务处理
TaskExecutorSpring 提供的线程池封装,与 Spring 容器集成良好,推荐在 Spring Boot 项目中使用。Spring 项目中的多线程任务处理
@Async + 自定义线程池结合 Spring 的异步功能和线程池,适合需要异步执行的任务。异步任务处理

在 Spring Boot 中,虽然没有直接等同于 C# 的 ThreadPool 类的功能,但可以通过以下几种方式实现类似线程池的功能:


1. 使用 Java 自带的 ExecutorService

Java 提供了 ExecutorService 接口和 Executors 工具类,可以创建和管理线程池。这种方式类似于 C# 的 ThreadPool

示例代码:
 

Java

深色版本

import org.springframework.stereotype.Service;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Service
public class ThreadPoolService {

    // 创建固定大小的线程池
    private final ExecutorService executorService = Executors.newFixedThreadPool(5);

    public void executeTask(int taskId) {
        executorService.submit(() -> {
            System.out.println("Executing task " + taskId + " in thread: " + Thread.currentThread().getName());
            try {
                Thread.sleep(1000); // 模拟耗时操作
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Finished task " + taskId);
        });
    }
}
调用代码:
 

Java

深色版本

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TaskController {

    @Autowired
    private ThreadPoolService threadPoolService;

    @GetMapping("/run-tasks")
    public String runTasks() {
        for (int i = 1; i <= 10; i++) {
            threadPoolService.executeTask(i);
        }
        return "Tasks submitted!";
    }
}
运行结果:

访问 /run-tasks 后,您会看到类似以下输出:

 

深色版本

Executing task 1 in thread: pool-1-thread-1
Executing task 2 in thread: pool-1-thread-2
Finished task 1
...

2. 使用 Spring 的 TaskExecutor

Spring 提供了 TaskExecutor 接口,它是对 Java 线程池的封装,更符合 Spring 的编程风格。

配置线程池:
 

Java

深色版本

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(name = "taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 核心线程数
        executor.setMaxPoolSize(10); // 最大线程数
        executor.setQueueCapacity(25); // 队列容量
        executor.setThreadNamePrefix("SpringThreadPool-"); // 线程名称前缀
        executor.initialize();
        return executor;
    }
}
使用线程池:
 

Java

深色版本

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;

@Service
public class TaskService {

    @Autowired
    private ThreadPoolTaskExecutor taskExecutor;

    public void executeTasks() {
        for (int i = 1; i <= 10; i++) {
            final int taskId = i;
            taskExecutor.execute(() -> {
                System.out.println("Executing task " + taskId + " in thread: " + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000); // 模拟耗时操作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Finished task " + taskId);
            });
        }
    }
}
调用代码:
 

Java

深色版本

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TaskController {

    @Autowired
    private TaskService taskService;

    @GetMapping("/run-tasks")
    public String runTasks() {
        taskService.executeTasks();
        return "Tasks submitted!";
    }
}
运行结果:

访问 /run-tasks 后,输出类似于:

 

深色版本

Executing task 1 in thread: SpringThreadPool-1
Executing task 2 in thread: SpringThreadPool-2
Finished task 1
...

3. 使用 @Async 和自定义线程池

如果您希望结合 Spring 的异步功能和线程池,可以为 @Async 方法指定一个自定义线程池。

配置线程池:
 

Java

深色版本

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

import java.util.concurrent.Executor;

@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean(name = "asyncTaskExecutor")
    public Executor asyncTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        executor.setThreadNamePrefix("AsyncThreadPool-");
        executor.initialize();
        return executor;
    }
}
定义异步方法:
 

Java

深色版本

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncTaskService {

    @Async("asyncTaskExecutor") // 使用指定的线程池
    public void executeTask(int taskId) {
        System.out.println("Executing task " + taskId + " in thread: " + Thread.currentThread().getName());
        try {
            Thread.sleep(1000); // 模拟耗时操作
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Finished task " + taskId);
    }
}
调用代码:
 

Java

深色版本

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TaskController {

    @Autowired
    private AsyncTaskService asyncTaskService;

    @GetMapping("/run-tasks")
    public String runTasks() {
        for (int i = 1; i <= 10; i++) {
            asyncTaskService.executeTask(i);
        }
        return "Tasks submitted!";
    }
}
运行结果:

访问 /run-tasks 后,输出类似于:

 

深色版本

Executing task 1 in thread: AsyncThreadPool-1
Executing task 2 in thread: AsyncThreadPool-2
Finished task 1
...

4. 总结与选择

方式特点适用场景
ExecutorServiceJava 原生 API,灵活性高,适合需要完全控制线程池的场景。通用多线程任务处理
TaskExecutorSpring 提供的线程池封装,与 Spring 容器集成良好,推荐在 Spring Boot 项目中使用。Spring 项目中的多线程任务处理
@Async + 自定义线程池结合 Spring 的异步功能和线程池,适合需要异步执行的任务。异步任务处理

C# 的 ThreadPool 对应:

  • 如果需要类似 ThreadPool.QueueUserWorkItem 的功能,可以选择 ExecutorService 或 TaskExecutor
  • 如果需要类似 Task.Run 的异步功能,可以选择 @Async

根据您的需求选择合适的方式即可!如果有其他问题,欢迎继续提问! 😊

代码模式

深度思考

联网搜索

代码模式

PPT创作

指令中心

服务生成的所有内容均由人工智能模型生成,其生成内容的准确性和完整性无法保证,不代表我们的态度或观点

相关文章:

  • React(九)React Hooks
  • RabbitMQ的工作模式
  • nginx的自动跳转https
  • 客户端给服务器发数据,服务器不显示:开放端口操作
  • 【工作梳理】怎么把f12里面的东西导入到postman
  • 赛逸展2025“创新引擎”启动:限量席位,点亮科技绿色新征程
  • 七. JAVA类和对象(一)
  • 权限框架SpringSecurity介绍
  • 【功能开发】DSP F2837x 检测中断所有函数运行一次的时间
  • 多模态大语言模型arxiv论文略读(二)
  • 基于Edge-TTS的OpenAI兼容文本转语音API实战指南
  • QwQ-32B-GGUF模型部署
  • 快速入手-基于DRF的过滤、分页、查询配置(十五)
  • 2025年渗透测试面试题总结-某 携程旅游-基础安全工程师(题目+回答)
  • 41、当你在 index.html 中引用了一个公共文件(比如 common.js),修改这个文件后,用户访问页面时仍然看到旧内容,因为浏览器缓存了旧版本
  • 人工智能-LangGraph+ChatUI+DeepSeek API搭建本地智能助手
  • 搭建开源笔记平台:outline
  • 如何在 Unity3D 导入 Spine 动画
  • 【NLP】15. NLP推理方法详解 --- 动态规划:序列标注,语法解析,共同指代
  • JavaScript 库:全面解析与推荐
  • 中国国家电影局与俄罗斯文化部签署电影合作文件
  • 乡村快递取件“跑腿费”屡禁不止?云南元江县公布举报电话
  • 明查|这是“C919迫降在农田”?实为飞机模型将用于科普体验
  • 吴清:加强监管的同时传递监管温度,尽力帮助受影响企业应对美加征关税的冲击
  • 长三角9座“万亿城市”一季报出炉:多地机器人产量大增
  • 国铁:今天预计发送旅客2110万人次,加开列车1896列