Spring boot使用注解@Async實(shí)現(xiàn)異步調(diào)用

0608142600.png

1.自定義線程池

@EnableAsync
@Configuration
public class BeanConfig {
    @Bean("taskExecutor")
    public Executor initTaskExecutor(){
        ThreadPoolTaskExecutor executor= new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(20);
        executor.setQueueCapacity(200);
        executor.setThreadNamePrefix("taskExecutor-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }
}

上面我們通過使用 ThreadPoolTaskExecutor創(chuàng)建了一個(gè)線程池,同時(shí)設(shè)置了以下這些參數(shù):
?核心線程數(shù)10:線程池創(chuàng)建時(shí)候初始化的線程數(shù)
?最大線程數(shù)20:線程池最大的線程數(shù),只有在緩沖隊(duì)列滿了之后才會(huì)申請(qǐng)超過核心線程數(shù)的線程
?緩沖隊(duì)列200:用來緩沖執(zhí)行任務(wù)的隊(duì)列
?允許線程的空閑時(shí)間60秒:當(dāng)超過了核心線程出之外的線程在空閑時(shí)間到達(dá)之后會(huì)被銷毀
?線程池名的前綴:設(shè)置好了之后可以方便我們定位處理任務(wù)所在的線程池
?線程池對(duì)拒絕任務(wù)的處理策略:這里采用了 CallerRunsPolicy策略,當(dāng)線程池沒有處理能力的時(shí)候,該策略會(huì)直接在 execute 方法的調(diào)用線程中運(yùn)行被拒絕的任務(wù);如果執(zhí)行程序已關(guān)閉,則會(huì)丟棄該任務(wù)

2.定義任務(wù)執(zhí)行類ExecutorTaskService

@Service
public class ExecutorTaskService {

    @Async("taskExecutor")
    public void doTask1() throws InterruptedException {
        System.out.println("開始做任務(wù)一");
        long start = System.currentTimeMillis();
        Thread.sleep(2000);
        long end = System.currentTimeMillis();
        System.out.println("完成任務(wù)一,耗時(shí):" + (end - start) + "毫秒");
    }

    @Async("taskExecutor")
    public void doTask2() throws InterruptedException {
        System.out.println("開始做任務(wù)二");
        long start = System.currentTimeMillis();
        Thread.sleep(1000);
        long end = System.currentTimeMillis();
        System.out.println("完成任務(wù)二,耗時(shí):" + (end - start) + "毫秒");
    }

    @Async("taskExecutor")
    public void doTask3() throws InterruptedException {
        System.out.println("開始做任務(wù)三");
        long start = System.currentTimeMillis();
        Thread.sleep(500);
        long end = System.currentTimeMillis();
        System.out.println("完成任務(wù)三,耗時(shí):" + (end - start) + "毫秒");
    }
}

3.定義controller

@RequestMapping("/executor")
@Controller
public class ExecutorTaskCtrl {

    @Autowired
    private ExecutorTaskService executorTaskService;

    @RequestMapping(value = "/doTask",method = RequestMethod.GET)
    @ResponseBody
    public void doTask() throws InterruptedException {
        executorTaskService.doTask1();
        executorTaskService.doTask2();
        executorTaskService.doTask3();
    }
}

訪問http://localhost:9999/executor/doTask 查看打印結(jié)果:
開始做任務(wù)二
開始做任務(wù)一
開始做任務(wù)三
完成任務(wù)三,耗時(shí):501毫秒
完成任務(wù)二,耗時(shí):1001毫秒
完成任務(wù)一,耗時(shí):2001毫秒

參考原創(chuàng): 翟永超

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,547評(píng)論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,136評(píng)論 1 32
  • 前言 線程池是Java中的一個(gè)重要概念,從Android上來說,當(dāng)我們跟服務(wù)端進(jìn)行數(shù)據(jù)交互的時(shí)候我們都知道主線程不...
    老實(shí)任閱讀 1,273評(píng)論 1 9
  • 文:楊飛 近幾年移動(dòng)端流量“爆炸”,促進(jìn)了自媒體行業(yè)高速發(fā)展,加上自媒體軟件用戶體驗(yàn)好流量高,使很多知名媒體、大咖...
    xinmeiyuan閱讀 625評(píng)論 0 1
  • 從上往下數(shù) 第一本:TN 護(hù)照本-日計(jì)劃 日計(jì)劃會(huì)有簡單的分區(qū),to do list部分:每日最重要的三件事,放松...
    璃諾_Lee閱讀 349評(píng)論 0 0