线程池使用
1、在“application.yml”配置中添加线程配置
spring:
threadpool:
corePoolSize: 2
maxPoolSize: 5
keepAliveSeconds: 60
queueCapacity: 120
namePrefix: demoaTask
2、添加配置类

2.1、AsyncTaskExecutePool.java
package com.sgcc.dlsc.demoa.config.threadpool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@Slf4j
@Configuration
public class AsyncTaskExecutePool implements AsyncConfigurer {
@Autowired
private TaskThreadPoolConfig config;
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(config.getCorePoolSize());
executor.setMaxPoolSize(config.getMaxPoolSize());
executor.setQueueCapacity(config.getQueueCapacity());
executor.setKeepAliveSeconds(config.getKeepAliveSeconds());
executor.setThreadNamePrefix("DefaltPool-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new AsyncUncaughtExceptionHandler() {
@Override
public void handleUncaughtException(Throwable arg0, Method arg1, Object... arg2) {
log.error("==========================" + arg0.getMessage() + "=======================", arg0);
log.error("exception method:" + arg1.getName());
}
};
}
}
2.2、TaskExecutePool.java
package com.sgcc.dlsc.demoa.config.threadpool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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
@Slf4j
@EnableAsync
public class TaskExecutePool {
public final static String TaskExecutor = "TaskExecutor";
@Autowired
private TaskThreadPoolConfig config;
@Bean(name = TaskExecutePool.TaskExecutor)
public Executor gatewayTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
log.debug(config.toString());
executor.setCorePoolSize(config.getCorePoolSize());
executor.setMaxPoolSize(config.getMaxPoolSize());
executor.setQueueCapacity(config.getQueueCapacity());
executor.setKeepAliveSeconds(config.getKeepAliveSeconds());
executor.setThreadNamePrefix(config.getNamePrefix());
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
2.3、TaskThreadPoolConfig.java
package com.sgcc.dlsc.demoa.config.threadpool;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "spring.threadpool")
public class TaskThreadPoolConfig {
private int corePoolSize;
private int maxPoolSize;
private int keepAliveSeconds;
private int queueCapacity;
private String namePrefix;
}
3、使用示范
3.1、编写service接口
package com.sgcc.dlsc.demoa.service;
public interface ThreadPoolService {
void testThreadPool();
}
3.2、编写实现类
package com.sgcc.dlsc.demoa.service.impl;
import com.sgcc.dlsc.demoa.config.threadpool.TaskExecutePool;
import com.sgcc.dlsc.demoa.service.ThreadPoolService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class ThreadPoolServiceImpl implements ThreadPoolService {
@Async(TaskExecutePool.TaskExecutor)
@Override
public void testThreadPool() {
log.info("我正在处理任务中");
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("任务处理完成");
}
}
4、调用测试
package com.sgcc.dlsc.demoa.controller;
import com.sgcc.comm.util.ResultUtil;
import com.sgcc.dlsc.demoa.service.ThreadPoolService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
@RequestMapping("/ThreadPool")
public class ThreadPoolController {
@Autowired
private ThreadPoolService threadPoolService;
@PostMapping("/testThreadPool")
public ResultUtil testThreadPool(){
threadPoolService.testThreadPool();
return ResultUtil.result("后台正在处理中,大约需要15秒钟");
}
}