1.先创线程池参数类
package com.hjp.sakura.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author hjp
* @description
* @date 2022/11/16 15:34
*/
@ConfigurationProperties(prefix = "thread")
@Component
@Data
public class ThreadConfig {
/**
* 核心线程数
*/
private Integer coreSize;
/**
* 最大线程数
*/
private Integer maxSize;
/**
* 空闲存活时间
*/
private Integer keepAliveTime;
/**
* 队列容量
*/
private Integer queueCapacity;
}
2.在配置文件里配置线程参数
#线程池配置
thread:
core-size: 12
max-size: 24
keep-alive-time: 60
queue-capacity: 24
3.创建线程池配置类
package com.hjp.sakura.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author hjp
* @description
* @date 2022/11/18 15:12
*/
@Configuration
public class ThreadPoolConfig {
@Bean("threadPoolExecutor")
public static ThreadPoolExecutor threadPoolExecutor(ThreadConfig config) {
return new ThreadPoolExecutor(config.getCoreSize(), config.getMaxSize(), config.getKeepAliveTime(),
TimeUnit.SECONDS, new LinkedBlockingDeque<>(10000), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
}
@Bean("taskPoolExecutor")
public static ThreadPoolTaskExecutor threadPoolTaskExecutor(ThreadConfig config) {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
//设置核心线程数
taskExecutor.setCorePoolSize(config.getCoreSize());
//设置最大线程数
taskExecutor.setMaxPoolSize(config.getMaxSize());
//设置队列最大容量
taskExecutor.setQueueCapacity(config.getQueueCapacity());
//设置线程空闲时间(秒)
taskExecutor.setKeepAliveSeconds(config.getKeepAliveTime());
//设置线程名称前缀
taskExecutor.setThreadNamePrefix("taskPoolExecutor--");
//调度器shutdown方法被调用时等待当前被调度的任务完成
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
//等待时间(秒)
taskExecutor.setAwaitTerminationSeconds(60);
//拒绝策略
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
//初始化线程池
taskExecutor.initialize();
return taskExecutor;
}
}
4.使用的话直接注入就好
package com.hjp.sakura.service.impl;
import com.hjp.sakura.request.AddUserRequest;
import com.hjp.sakura.vo.User;
import com.hjp.sakura.mapper.UserMapper;
import com.hjp.sakura.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.UUID;
import java.util.concurrent.ThreadPoolExecutor;
/**
* <p>
* 用户表 服务实现类
* </p>
*
* @author hjp
* @since 2022-11-16
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Autowired
private UserMapper userMapper;
@Override
public void addUser(AddUserRequest request) {
Date date = new Date();
threadPoolTaskExecutor.execute(new Runnable() {
@Override
public void run() {
User user = new User();
user.setUserName(request.getUserName());
user.setCreateTime(date);
user.setUpdateTime(date);
userMapper.insert(user);
}
});
}
}