springboot中@Scheduled 和@Async的使用

首先,需要了解@Scheduled 和@Async這倆注解的區(qū)別:

@Scheduled 任務(wù)調(diào)度注解,主要用于配置定時(shí)任務(wù);springboot默認(rèn)的調(diào)度器線程池大小為 1。

注意:在spring中的@schedule默認(rèn)的線程池中只有一個(gè)線程,所以如果在多個(gè)方法上加上@schedule的話,此時(shí)就會有多個(gè)任務(wù)加入到延時(shí)隊(duì)列中,因?yàn)橹挥幸粋€(gè)線程,所以任務(wù)只能被一個(gè)一個(gè)的執(zhí)行

@Async 任務(wù)異步執(zhí)行注解,主要用于方法上,表示當(dāng)前方法會使用新線程異步執(zhí)行;springboot默認(rèn)執(zhí)行器線程池大小為100。

此注解會將這個(gè)任務(wù)放入到一個(gè)異步線程中執(zhí)行,不會阻塞主線程,可以用在一些比較耗時(shí)并且不用考慮返回值的一些操作中

使用:

    1.開啟異步任務(wù)的開關(guān)

    在啟動(dòng)類上添加注解@EnableAsync @EnableScheduling
image.png

2.在定時(shí)任務(wù)上加上注解

@Scheduled(fixedDelay = 1000)
    @Async
    public void executeUpdateYqTask() {
        System.out.println(Thread.currentThread().getName() + " >>> task one " + format.format(new Date()));
    }

    @Scheduled(fixedDelay = 1000)
    @Async
    public void executeRepaymentTask() throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + " >>> task two " + format.format(new Date()));
        Thread.sleep(5000);
    }

可以看到控制臺輸出已經(jīng)是異步執(zhí)行了


image.png

總結(jié)

1 默認(rèn)@schedule 線程池默認(rèn)只有一個(gè)線程,多個(gè)任務(wù)時(shí)串行 串行

2 默認(rèn)@schedule + @Aysnc 多個(gè)任務(wù)之間串行,單個(gè)任務(wù)非阻塞異步執(zhí)行 并行+異步

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容