前言
專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)扎賚特免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
我們?cè)趯?shí)際項(xiàng)目中有些復(fù)雜運(yùn)算、耗時(shí)操作,就可以利用多線(xiàn)程來(lái)充分利用CPU,提高系統(tǒng)吞吐量。SpringBoot對(duì)多線(xiàn)程支持非常好,對(duì)我們的開(kāi)發(fā)非常便捷。
Future模式是多線(xiàn)程開(kāi)發(fā)中非常常見(jiàn)的一種設(shè)計(jì)模式。核心思想是異步調(diào)用。當(dāng)我們執(zhí)行一個(gè)方法時(shí),方法中有多個(gè)耗時(shí)任務(wù)需要同時(shí)去做,而且又不著急等待這個(gè)結(jié)果時(shí)可以讓客戶(hù)端立即返回然后,后臺(tái)慢慢去計(jì)算任務(wù)。
當(dāng)我們做一件事的時(shí)候需要等待,那么我們就可以在這個(gè)等待時(shí)間內(nèi)來(lái)去做其它事情,這樣就可以充分利用時(shí)間。比如我們點(diǎn)外賣(mài),需要一段時(shí)間,那么我們?cè)诘韧赓u(mài)的時(shí)間里可以看點(diǎn)書(shū),看個(gè)電影。這就是典型的Future模式。如果是普通模式的話(huà),就是等外賣(mài)的時(shí)候就等外賣(mài),外賣(mài)到了后再去看書(shū),極大的浪費(fèi)時(shí)間。
SpringBoot對(duì)Future模式支持非常好,只需要簡(jiǎn)單的代碼就能實(shí)現(xiàn)。
1.Future的相關(guān)方法
2.需要的注解
springboot 配置多線(xiàn)程需要兩個(gè)注解
1、@EnableAsync
在配置類(lèi)中通過(guò)加@EnableAsync開(kāi)啟對(duì)異步任務(wù)的支持
2、@Async
在需要執(zhí)行的方法上加@Async表明該方法是個(gè)異步方法,如果加在類(lèi)級(jí)別上,則表明類(lèi)所有的方法都是異步方法
3.配置代碼
@Configuration @EnableAsync public class AsyncConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); //核心線(xiàn)程數(shù) taskExecutor.setCorePoolSize(8); //最大線(xiàn)程數(shù) taskExecutor.setMaxPoolSize(16); //隊(duì)列大小 taskExecutor.setQueueCapacity(100); taskExecutor.initialize(); return taskExecutor; } }
4.FutureService
@Service public class FutureService { @Async public FuturefutureTest() throws InterruptedException { System.out.println("任務(wù)執(zhí)行開(kāi)始,需要:1000ms"); for (int i = 0; i < 10; i++) { Thread.sleep(100); System.out.println("do:" + i); } System.out.println("完成任務(wù)"); return new AsyncResult<>(Thread.currentThread().getName()); } }
【注】這里的方法自動(dòng)被注入使用上文配置的ThreadPoolTaskExecutor
5.測(cè)試代碼
@Resource private FutureService futureService; @Test public void futureTest() throws InterruptedException, ExecutionException { long start = System.currentTimeMillis(); System.out.println("開(kāi)始"); //耗時(shí)任務(wù) Futurefuture = futureService.futureTest(); //另外一個(gè)耗時(shí)任務(wù) Thread.sleep(500); System.out.println("另外一個(gè)耗時(shí)任務(wù),需要500ms"); String s = future.get(); System.out.println("計(jì)算結(jié)果輸出:" + s); System.out.println("共耗時(shí):" + (System.currentTimeMillis() - start)); }
6.運(yùn)行結(jié)果
開(kāi)始
2019-01-07 23:50:34.726 INFO 14648 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService
任務(wù)執(zhí)行開(kāi)始,需要:1000ms
do:0
do:1
do:2
do:3
另外一個(gè)耗時(shí)任務(wù),需要500ms
do:4
do:5
do:6
do:7
do:8
do:9
完成任務(wù)
計(jì)算結(jié)果輸出:ThreadPoolTaskExecutor-1
共耗時(shí):1016Process finished with exit code 0
本來(lái)需要至少1500ms 執(zhí)行的任務(wù)現(xiàn)在只需要1016ms,因?yàn)樵趫?zhí)行耗時(shí)任務(wù)1的同時(shí)也在執(zhí)行耗時(shí)任務(wù)2,兩個(gè)任務(wù)并行執(zhí)行,這就是future模式的好處,在等待時(shí)間內(nèi)去執(zhí)行其它任務(wù),能夠充分利用時(shí)間
【注】本文基于SpringBoot 2.0
GitHub 連接
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。