springboot中使用线程池
application.peoperties
# 异步线程配置
async.executor.thread.core_pool_size = 5
# 配置最大线程数
async.executor.thread.max_pool_size = 5
# 配置队列大小
async.executor.thread.queue_capacity = 200
# 配置线程池中的线程的名称前缀
async.executor.thread.name.prefix = async-ser-
线程池配置类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
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;
@Configuration
@EnableAsync
public class ExecutorConfig {
private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);
@Value("${async.executor.thread.core_pool_size}")
private int corePoolSize;
@Value("${async.executor.thread.max_pool_size}")
private int maxPoolSize;
@Value("${async.executor.thread.queue_capacity}")
private int queueCapacity;
@Value("${async.executor.thread.name.prefix}")
private String namePrefix;
@Bean(name = "asyncServiceExecutor")
public Executor asyncServiceExecutor() {
logger.info("start asyncServiceExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 配置核心线程数
executor.setCorePoolSize(corePoolSize);
// 配置最大线程数
executor.setMaxPoolSize(maxPoolSize);
// 配置队列大小
executor.setQueueCapacity(queueCapacity);
// 配置线程池中的线程的名称前缀
executor.setThreadNamePrefix(namePrefix);
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//执行初始化
executor.initialize();
return executor;
}
}
service中使用
/**
* @Description TODO
* @ClassName AsyncServiceImpl
* @date 2022/12/13 17:39
* @Author
**/
@Service
@EnableAsync
public class AsyncServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class);
@Async("asyncServiceExecutor")
public void executeAsync() {
logger.info("start executeAsync");
System.out.println("异步线程要做的事情");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("插入日志等耗时的事情");
logger.info("end executeAsync");
}
}
将下面run() 中的任务放入即可,线程池方式完。
Runnable开启线程实现异步
public class SendHttpAsyMessageUtil implements Runnable {
private HashMap<String, Object> preams;
private String url;
private ISendMessagesService sendMessagesService;
private String projectName;
public SendHttpAsyMessageUtil(HashMap<String, Object> preams, String url, ISendMessagesService sendMessagesService,String projectName) {
this.preams = preams;
this.url = url;
this.sendMessagesService = sendMessagesService;
this.projectName=projectName;
}
public SendHttpAsyMessageUtil() {
}
@Override
public void run() {
sendMessagesService.sendGetMessageByHttpClient(preams, url,projectName);
}
}
service中调用
//发送异步消息
SendHttpAsyMessageUtil sendHttpAsyMessageUtil = new SendHttpAsyMessageUtil(hashMap, url, sendMessagesService, encodecContractInfo.getProjectName());
new Thread(sendHttpAsyMessageUtil).start();