一只码狗 2024-03-31 10:54 采纳率: 33.3%
浏览 2

springboot线程池

最近在看线程池相关的知识
我使用的是自定义线程池配置类,然后对方法使用异步标签指定线程池,如下图。
想问下这里线程池是怎么自动submit提交线程的?默认线程类型是?能不能手动修改创建的线程类型?

img

img

img

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-31 10:55
    关注

    引自免费微信小程序:皆我百晓生

    在Spring Boot中实现自定义线程池并使其自动提交任务的步骤如下:

    1. 创建ThreadPoolExecutor配置类 首先,创建一个ThreadPoolExecutor配置类,如下所示:

    import org.springframework.core.annotation.Bean;
    import org.springframework.core.annotation.concurrent.ThreadPoolTaskExecutor;
    
    @Configuration
    public class ThreadPoolConfig {
    
        @Bean(name = "threadPoolExecutor")
        public ThreadPoolTaskExecutor threadPoolExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            // 设置核心线程数、最大线程数、队列容量、保持时间等属性
            executor.setCorePoolSize(10);
            executor.setMaxPoolSize(20);
            executor.setQueueCapacity(100);
            executor.setKeepAliveSeconds(100);
            executor.setThreadNamePrefix("threadExecutor-");
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
            return executor;
        }
    }
    

    2. 使用@Async注解将ThreadPoolExecutor标记为异步任务执行器 在配置类中,通过@Async注解将ThreadPoolTaskExecutor标记为异步任务执行器,如图1所示:

    @Configuration
    @EnableAsync
    public class AsyncConfig extends ThreadPoolConfig {
    
        @Override
        protected ThreadPoolTaskExecutor getTaskExecutor() {
            return threadPoolExecutor();
        }
    
        @Override
        public void configureTasks(AsyncConfiguration configuration) {
            configuration.executeAsyncJob(new Runnable() {
                @Override
                public void run() {
                    System.out.println("Task Executor executed: " + Thread.currentThread().getName());
                }
            });
        }
    }
    

    3. 定义任务调度策略 在配置类中,定义一个任务调度策略(例如,轮询、固定间隔或定时)并设置线程池的相关属性:

    @Configuration
    @EnableAsync
    public class AsyncConfig extends ThreadPoolConfig {
    
        @Override
        protected ThreadPoolTaskExecutor getTaskExecutor() {
            return threadPoolExecutor();
        }
    
        @Override
        public void configureTasks(AsyncConfiguration configuration) {
            // 选择任务调度策略,此处我们使用轮询
            configuration.setTaskExecutorPerfLoggingEnabled(true);
            scheduleExecuteTaskByPolling(1000, TimeUnit.MILLISECONDS);
        }
    
        private void scheduleExecuteTaskByPolling(int pollFrequency, TimeUnit unit) {
            configuration.scheduleAtFixedRate(() -> {
                System.out.println("Task Executor scheduled to execute after " + pollFrequency + " milliseconds.");
                // 在这里添加任务逻辑
                try {
                    Thread.sleep(pollFrequency * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }, 0, pollFrequency, unit);
        }
    }
    

    4. 显示任务提交的流程示例 在Java应用程序启动后,调用scheduleExecuteTaskByPolling方法并传递所需参数,以便自动从任务池提交任务。以下是一个简单的示例:

    @SpringBootApplication
    @EnableAsync
    public class MyApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
            MyService service = new MyService();
            system.out.println(service.doSomethingAsync());
        }
    
        public static class MyService {
            public void doSomethingAsync() {
                System.out.println("Do something in the background...");
            }
        }
    }
    

    在这个示例中,我们在doSomethingAsync()方法中打印一条消息表示线程正在执行。当任务到达特定次数(在这个例子中为1000次)时,会自动提交到线程池进行后续处理。

    注意,@Async注解通常用于单个异步方法,而configureTasks方法则接受@EnableAsync注解声明的上下文,并在其内部管理异步任务执行流程。这包括任务调度策略的选择、任务提交的时间延迟以及资源分配等细节。如果需要全局开启异步任务,可以在application.properties文件中配置相应的相关选项,如async=true。例如:

    async=true
    

    以上就是在Spring Boot中实现自定义线程池并使其自动提交任务的基本步骤,您可以根据实际需求调整这些配置参数。如果您需要使用AI辅助解决此类问题,建议您查阅官方文档、Stack Overflow或其他相关技术论坛,以获取更全面和详细的指导。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月31日

悬赏问题

  • ¥15 如何构建全国统一的物流管理平台?
  • ¥100 ijkplayer使用AndroidStudio/CMake编译,如何支持 rtsp 直播流?
  • ¥20 和学习数据的传参方式,选择正确的传参方式有关
  • ¥15 这是网络安全里面的poem code
  • ¥15 用js遍历数据并对非空元素添加css样式
  • ¥15 使用autodl云训练,希望有直接运行的代码(关键词-数据集)
  • ¥50 python写segy数据出错
  • ¥20 关于线性结构的问题:希望能从头到尾完整地帮我改一下,困扰我很久了
  • ¥30 3D多模态医疗数据集-视觉问答
  • ¥20 设计一个二极管稳压值检测电路