国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

SpringBoot中使用多線程的方法示例

瀏覽:76日期:2023-03-20 14:55:33
一、介紹

Spring是通過任務執行器(TaskExecutor)來實現多線程和并發編程,使用Spring提供的ThreadPoolTaskExecutor來創建一個基于線城池的TaskExecutor。在使用線程池的大多數情況下都是異步非阻塞的。節省更多的時間,提高效率。

工作原理

SpringBoot中使用多線程的方法示例

當主線程中調用execute接口提交執行任務時:則執行以下步驟:注意:線程池初始時,是空的。

如果當前線程數<corePoolSize,如果是則創建新的線程執行該任務 如果當前線程數>=corePoolSize,則將任務存入BlockingQueue 如果阻塞隊列已滿,且當前線程數<maximumPoolSize,則新建線程執行該任務。 如果阻塞隊列已滿,且當前線程數>=maximumPoolSize,則拋出異常RejectedExecutionException,告訴調用者無法再接受任務了。

在Springboot中對其進行了簡化處理,只需要配置一個類型為java.util.concurrent.TaskExecutor或其子類的bean,并在配置類或直接在程序入口類上聲明注解@EnableAsync,即可可以開啟異步任務。

調用也簡單,在由Spring管理的對象的方法上標注注解@Async,聲明是異步任務,顯式調用即可生效。

二、聲明

讓配置類實現AsyncConfigurer接口,并重寫getAsyncExecutor方法,并返回一個ThreasPoolTaskExecutor,就可以獲取一個基于線程池的TaskExecutor使用注解@EnableAsync開啟異步,會自動掃描

@Configuration@EnableAsyncpublic class ThreadConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(15); executor.setQueueCapacity(25); executor.initialize(); return executor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; }}三、調用

通過@Async注解表明該方法是異步方法,如果注解在類上,那表明這個類里面的所有方法都是異步的

@Servicepublic class AsyncTaskService { @Async public void executeAsyncTask(int i) { System.out.println('線程' + Thread.currentThread().getName() + ' 執行異步任務:' + i); }}四、進階

有時候我們不止希望異步執行任務,還希望任務執行完成后會有一個返回值,在java中提供了Future泛型接口,用來接收任務執行結果,springboot也提供了此類支持,使用實現了ListenableFuture接口的類如AsyncResult來作為返回值的載體。比如上例中,我們希望返回一個類型為String類型的值,可以將返回值改造為:

@Async public Future<String> executeAsyncTaskWithResult2(int i) { System.out.println('線程' + Thread.currentThread().getName() + ' 開始執行異步任務' + i); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println('線程' + Thread.currentThread().getName() + ' 結束執行異步任務' + i); return new AsyncResult<>('線程' + Thread.currentThread().getName() + ' 執行異步任務:' + i); }

調用返回值:get()是阻塞式,等待當前線程完成才返回值

public void threadTest() { try { List<Future> futures = new ArrayList<>(); for (int i = 0; i < 20; i++) {futures.add(asyncTaskService.executeAsyncTaskWithResult2(i)); } // 獲取值。get是阻塞式,等待當前線程完成才返回值 for (Future<String> future : futures) {System.out.println('返回結果:' + future.get()); } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }補充

實際上,@Async還有一個參數,通過Bean名稱來指定調用的線程池-比如上例中設置的線程池參數不滿足業務需求,可以另外定義合適的線程池,調用時指明使用這個線程池-缺省時springboot會優先使用名稱為’taskExecutor’的線程池,如果沒有找到,才會使用其他類型為TaskExecutor或其子類的線程池。

到此這篇關于SpringBoot中使用多線程的方法示例的文章就介紹到這了,更多相關SpringBoot使用多線程內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 中文字幕在线免费观看 | 国产欧美日韩不卡在线播放在线 | 深夜爽爽爽福利动态图 | 亚洲性色视频 | 暖暖免费高清日本一区二区三区 | 日本高清色本在线www | 久久99国产精品久久99果冻传媒 | 在线看片日本 | 亚洲国产高清一区二区三区 | 久草福利资源在线观看 | 欧美日本一区 | 爱综合 | 全免费a级毛片免费看视频免 | 酒色影院 | 国产亚洲欧美日韩在线观看一区二区 | 色噜噜国产精品视频一区二区 | 美国一级免费毛片 | 亚洲人成综合网站在线 | 亚洲制服丝袜美腿亚洲一区 | 99久久精品国产片久人 | 全免费a级毛片免费看不卡 全免费毛片在线播放 | 久热久草 | 亚洲国产美女视频 | 99精品这里只有精品高清视频 | 国产成年网站v片在线观看 国产成人aa在线视频 | 亚洲精品久久玖玖玖玖 | 特黄a三级三级三级 | 一区二区三区视频网站 | a在线v| 日韩在线免费视频 | 国产成 人 综合 亚洲绿色 | 欧美日韩国产在线人成dvd | 97久久国语露脸精品对白 | 欧美性色一级在线观看 | 91碰碰| 爽爽窝窝午夜精品一区二区 | 亚洲国产综合人成综合网站00 | 成人性生片全套 | 国产精品亚洲一区二区三区在线观看 | 国产午夜永久福利视频在线观看 | 久久这里只有精品视频99 |