首先,需要了解@Scheduled 和@Async這倆注解的區(qū)別:
@Scheduled 任務(wù)調(diào)度注解,主要用于配置定時(shí)任務(wù);springboot默認(rèn)的調(diào)度器線程池大小為 1辕漂。
注意:在spring中的@schedule默認(rèn)的線程池中只有一個(gè)線程厨喂,所以如果在多個(gè)方法上加上@schedule的話,此時(shí)就會(huì)有多個(gè)任務(wù)加入到延時(shí)隊(duì)列中奴烙,因?yàn)橹挥幸粋€(gè)線程助被,所以任務(wù)只能被一個(gè)一個(gè)的執(zhí)行
@Async 任務(wù)異步執(zhí)行注解,主要用于方法上切诀,表示當(dāng)前方法會(huì)使用新線程異步執(zhí)行揩环;springboot默認(rèn)執(zhí)行器線程池大小為100。
此注解會(huì)將這個(gè)任務(wù)放入到一個(gè)異步線程中執(zhí)行幅虑,不會(huì)阻塞主線程丰滑,可以用在一些比較耗時(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);
}
可以看到控制臺(tái)輸出已經(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í)行 并行+異步