springboot 线程池

1、在启动类上加标记 @EnableAsync

@Slf4j
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@EnableAsync
public class MyApplication extends SpringBootServletInitializer {

2、定义一个配置文件,取自 https://github.com/zq2599 中的一个,但不记得具体是哪个了

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Description : 异步线程池的配置类
 * @Author : zq2599
 * @Date : 2018-01-19 9:55
 */
@Configuration
@EnableAsync
public class ExecutorConfig {
    private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);

    @Bean
    public Executor asyncServiceExecutor() {
        logger.info("start asyncServiceExecutor");
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//        ThreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor();
        //配置核心线程数
        executor.setCorePoolSize(5);
        //配置最大线程数
        executor.setMaxPoolSize(5);
        //配置队列大小
        executor.setQueueCapacity(99999);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("async-service-");

        // rejection-policy:当pool已经达到max size的时候,如何处理新任务
        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //执行初始化
        executor.initialize();
        return executor;
    }
}

3、使用,方法名上加 @Async(“asyncServiceExecutor”)

 /**
     * 这个方法只在外部调用才会开线程,内部调用就是一普通方法
     *
     * @param stuId
     */
    @Override
    @Async("asyncServiceExecutor")
    public void matchPhoto(FaceSet faceSet, String stuId) {
     
        StudentPhoto stuPhoto = this.getOne(new LambdaQueryWrapper<StudentPhoto>().eq(StudentPhoto::getXsid, stuId));
        List<String> scoreList = new LinkedList<>();
        int nums = matchResultService.getSelNums(stuId) + 1;
....
}

注意的是,在同个类内调用这个方法时就是一个同步方法,不会开启线程

另外,单元测试中,这个类是数据库操作不可用,项目跑起来后,数据库操作才正常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中,可以使用`@EnableAsync`注解开启异步执行的支持,并通过配置来创建和管理线程池。 以下是一个示例代码,演示如何在Spring Boot中配置和使用线程池: 首先,在Spring Boot的启动类上添加`@EnableAsync`注解开启异步执行的支持: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @EnableAsync public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 然后,在需要异步执行的方法上添加`@Async`注解,表示该方法将被异步执行: ```java import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @Component public class MyService { @Async public void asyncMethod() { // 异步执行的逻辑代码 } } ``` 在上述示例中,`MyService`类中的`asyncMethod()`方法被标记为异步执行,当调用该方法时,Spring Boot会自动将其放入线程池中执行。 默认情况下,Spring Boot会创建一个线程池来处理异步任务。可以通过在`application.properties`或`application.yml`文件中配置相关属性来自定义线程池的参数。例如,可以配置线程池的大小、队列容量等等。下面是一个示例配置: ```properties spring.task.execution.pool.core-size=5 spring.task.execution.pool.max-size=10 spring.task.execution.pool.queue-capacity=25 ``` 通过以上配置,线程池的核心线程数为5,最大线程数为10,任务队列容量为25。 需要注意的是,Spring Boot默认使用的是`ThreadPoolTaskExecutor`作为线程池的实现类,但也可以根据需要自行配置其他的线程池实现类。 通过以上的配置和注解,就可以在Spring Boot中方便地创建和使用线程池来处理异步任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值