Java spring 使用線程池以及@Async 註解用法

一 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章