springboot线程池

本文通过一个例子展示了SpringBoot中如何使用线程池。在Service中定义了两个线程方法,当控制器调用这些方法时,发现它们在不同的线程中运行。通过配置线程池,可以实现任务的异步执行,并控制线程的同步行为。在Config中创建SyncConfiguration类,导入线程相关包,并在Service中应用线程池。
摘要由CSDN通过智能技术生成

service中的两个线程方法

@Slf4j
@Service
public class Score {
    @Async
    public void addScore(){
        try {
            Thread.sleep(5000);
            log.info("处理积分1");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    @Async("scorePoolTaskExecutor")
    public void addScore2(){
        try {
            Thread.sleep(5000);
            log.info("处理积分2");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在控制器中调用这个方法时,会先执行控制器中的方法,

@Configuration

@EnableAsync

@Autowired

private Score score;

@GetMapping("/score1")

public String score1(){

    log.info("这是主线程");

    this.score.addScore();

    return "ok";

}

可以看到输出这是主线程和过5秒后输出处理积分1,是不同的线程

但是会立刻输出ok,然后过5秒后输出处理积分1

如果不用同步,那么就是等待5秒后才会输出ok

 

java的线程池

 

在config下新建一个SyncConfiguration类

@Configuration
@EnableAsync
public class SyncConfiguration {
    @Bean(name = "scorePoolTaskExecutor")
    public ThreadPoolTaskExecutor getScorePoolTaskExecutor() {
        ThreadPoolTaskExecutor task = new ThreadPoolTaskExecutor();
        //核心线程数
        task.setCorePoolSize(10);
        //线程池维护线程的最大数量
        task.setMaxPoolSize(100);
        //缓存队列
        task.setQueueCapacity(50);
        //许的空闲时间
        task.setKeepAliveSeconds(200);

        task.setThreadNamePrefix("score-");
        //当线程池的任务缓存队列已满,并且线程池中的线程数达到maximumPoolSize,如果还有任务来到就会采取任务拒绝策略
        //ThreadPoolExecutor.AbortPolicy丢弃任务并跑去RejectedExecutionException策略
        //ThreadPoolExecutor.DiscardPolicy丢弃任务,但是不抛出异常
        //ThreadPoolExecutor.DiscardOldestPolicy丢弃队列最前面的任务,然后重新常使执行任务
        //ThreadPoolExecutor.CallerRunsPolicy重试添加当前的任务,自动重复调用execute方法,直到成功
        task.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        task.initialize();
        return task;
    }
}

在service类中增加,导入线程的这个包

import com.example.demo.config.SyncConfiguration;

@Async("scorePoolTaskExecutor")

public void addScore2(){

try {

Thread.sleep(5000);

log.info("处理积分2");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

在控制器中调用该方法

@Autowired

private Score score;

@GetMapping("/score2")

public String score2(){

log.info("score2的主线程");

this.score.addScore2();

return "ok";

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值