springboot多线程注解 @Async(“asyncExecutor“)
定义线程池 AsyncTaskExecutePool.java
import java.util.concurrent.ThreadPoolExecutor;
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 lombok.extern.slf4j.Slf4j;
@Slf4j
@Configuration
@EnableAsync
public class AsyncTaskExecutePool {
/** 线程池维护线程的最少数量 */
private int corePoolSize = 5;
/** 线程池维护线程的最大数量 */
private int maxPoolSize = 50;
/** 线程池所使用的缓冲队列 */
private int queueCapacity = 2;
@Bean(name = "asyncExecutor")
public ThreadPoolTaskExecutor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(3600);
executor.setThreadNamePrefix("asyncExecutor----");
executor.setWaitForTasksToCompleteOnShutdown(true);
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
log.info("------------------asyncExecutor start -------------------");
return executor;
}
@Bean(name = "delAsyncExecutor")
public ThreadPoolTaskExecutor delAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(3600);
executor.setThreadNamePrefix("delAsyncExecutor----");
executor.setWaitForTasksToCompleteOnShutdown(true);
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
log.info("------------------delAsyncExecutor start -------------------");
return executor;
}
}
线程执行任务 AsyncTask.java
import java.util.Map;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
public class AsyncTask {
@Async("asyncExecutor")
public void newThread(String key,RedisDao redis) {
redis.delete(key);
}
}
调用多线程
.
.
.
@Autowired
private AsyncTask asyncTask;
@Autowired
@Qualifier("asyncExecutor")
private ThreadPoolTaskExecutor executor;
.
.
.
int activeCount = executor.getActiveCount();
while (activeCount >= 49) {
Thread.sleep(10000);
activeCount = executor.getActiveCount();
log.info("executor-ActiveCount " +activeCount);
}
asyncTask.newThread(key,redisDao);
.
.
.