久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

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

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

瀏覽:68日期: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
相關文章:
主站蜘蛛池模板: 在线成人一区 | 欧美日韩一级电影 | 亚洲精品一区二区三区 | 美女扒开内裤让男人桶 | 成人欧美一区二区三区黑人孕妇 | 日韩中文字幕免费在线 | 99精品国产高清一区二区麻豆 | 日韩一区欧美一区 | 国产视频久久 | 久久精品小视频 | 久久久久久久香蕉 | 在线免费色视频 | 国产大学生情侣呻吟视频 | 亚洲一区视频 | 国产视频久久久久久久 | 四虎最新影视 | 亚洲欧美日韩在线一区 | 久久精品免费国产 | 一区视频在线 | 黄色小视频免费观看 | 亚洲综合在线一区 | 久久久久亚洲一区二区三区 | 武道仙尊动漫在线观看 | 毛片网站免费在线观看 | www中文字幕在线观看 | 女人爽到高潮aaaa电影 | 亚洲欧美日韩另类精品一区二区三区 | 99久久婷婷国产精品综合 | 午夜小视频免费 | 久久国产成人 | 99久久视频 | 久久成人一区二区 | 欧美激情网 | 国产免费一区二区三区 | 亚洲成人中文字幕 | 欧美大片在线看免费观看 | 午夜免费小视频 | 久久久久高清 | 国产精品久久久久久久久免费桃花 | 欧美黄色精品 | 日韩欧美一级精品久久 |