一 springboot 註解方法 使用線程池
1.首先啓動類上增加@EnableAsync註解
package cc.mrbird;
import cc.mrbird.common.config.NniuhaoProperies;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.time.LocalDate;
import java.time.LocalTime;
@SpringBootApplication
@EnableTransactionManagement
@MapperScan("cc.mrbird.*.dao")
@EnableConfigurationProperties({NniuhaoProperies.class})// 開啓配置屬性支持
@EnableCaching
@EnableAsync
public class Application /*extends SpringBootServletInitializer*/ {
private static Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
log.info("NIUHAO started up successfully at {} {}", LocalDate.now(), LocalTime.now());
}
}
2.編寫自定義線程池
package cn.digirun.bizos.gateway.core.properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
/**
* 功能描述: 配置自定義的線程池
*
* @auther: 鈕豪
* @date: 2018/11/1 17:58
*/
@Configuration//配置類把//普通pojo實例化到spring容器中
@EnableAsync//異步
public class ExecutorConfig {
private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);
@Bean
public Executor getAsyncExecutor() {
logger.info("start getAsyncExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心線程數
executor.setCorePoolSize(20);
//配置最大線程數
executor.setMaxPoolSize(50);
//配置隊列大小
executor.setQueueCapacity(999);
//活躍時間
executor.setKeepAliveSeconds(60 * 15);
//配置線程池中的線程的名稱前綴
executor.setThreadNamePrefix("-async-getAsyncExecutor-");
// setRejectedExecutionHandler:當pool已經達到max size的時候,如何處理新任務
// CallerRunsPolicy:不在新線程中執行任務,而是有調用者所在的線程來執行
/*
(1) 默認的ThreadPoolExecutor.AbortPolicy 處理程序遭到拒絕將拋出運行時RejectedExecutionException;
(2) ThreadPoolExecutor.CallerRunsPolicy 線程調用運行該任務的 execute 本身。此策略提供簡單的反饋控制機制,能夠減緩新任務的提交速度
(3) ThreadPoolExecutor.DiscardPolicy 不能執行的任務將被刪除;
(4) ThreadPoolExecutor.DiscardOldestPolicy 如果執行程序尚未關閉,則位於工作隊列頭部的任務將被刪除,然後重試執行程序(如果再次失敗,則重複此過程)。*/
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//執行初始化
executor.initialize();
return executor;
}
@Bean
public Executor getAsyncExecutor2() {
logger.info("start getAsyncExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心線程數
executor.setCorePoolSize(20);
//配置最大線程數
executor.setMaxPoolSize(50);
//配置隊列大小
executor.setQueueCapacity(9999);
//活躍時間
executor.setKeepAliveSeconds(60 * 15);
//配置線程池中的線程的名稱前綴
executor.setThreadNamePrefix("-async-");
// rejection-policy:當pool已經達到max size的時候,如何處理新任務
// CALLER_RUNS:不在新線程中執行任務,而是有調用者所在的線程來執行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//執行初始化
executor.initialize();
return executor;
}
}
3.接口使用
package cn.digirun.bizos.gateway.service;
import cn.digirun.bizos.gateway.core.token.TokenBean;
import cn.digirun.bizos.gateway.model.TokenRet;
import org.springframework.scheduling.annotation.Async;
import java.util.concurrent.Future;
/**
* @Auther: Administrator
* @Date: 2019/4/20 10:54
* @Description:
*/
public interface TokenGatewayService {
@Async(value = "getAsyncExecutor")
Future<TokenRet> create(TokenBean bean)throws Exception;
@Async(value = "getAsyncExecutor2")
Future<TokenRet> get(String token)throws Exception;
}