色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

淺談Java中spring 線程異步執(zhí)行

瀏覽:6日期:2022-08-28 14:25:14

多線程并發(fā)處理起來(lái)通常比較麻煩,如果你使用spring容器來(lái)管理業(yè)務(wù)bean,事情就好辦了多了。spring封裝了Java的多線程的實(shí)現(xiàn),你只需要關(guān)注于并發(fā)事物的流程以及一些并發(fā)負(fù)載量等特性,具體來(lái)說(shuō)如何使用spring來(lái)處理并發(fā)事務(wù):

1.了解 TaskExecutor接口

Spring的TaskExecutor接口等同于java.util.concurrent.Executor接口。 實(shí)際上,它存在的主要原因是為了在使用線程池的時(shí)候,將對(duì)Java5的依賴抽象出來(lái)。 這個(gè)接口只有一個(gè)方法execute(Runnable task),它根據(jù)線程池的語(yǔ)義和配置,來(lái)接受一個(gè)執(zhí)行任務(wù)。最初創(chuàng)建TaskExecutor是為了在需要時(shí)給其他Spring組件提供一個(gè)線程池的抽象。 例如ApplicationEventMulticaster組件、JMS的 AbstractMessageListenerContainer和對(duì)Quartz的整合都使用了TaskExecutor抽象來(lái)提供線程池。 當(dāng)然,如果你的bean需要線程池行為,你也可以使用這個(gè)抽象層。

2. TaskExecutor接口的實(shí)現(xiàn)類

(1)SimpleAsyncTaskExecutor 類

這個(gè)實(shí)現(xiàn)不重用任何線程,或者說(shuō)它每次調(diào)用都啟動(dòng)一個(gè)新線程。但是,它還是支持對(duì)并發(fā)總數(shù)設(shè)限,當(dāng)超過(guò)線程并發(fā)總數(shù)限制時(shí),阻塞新的調(diào)用,直到有位置被釋放。如果你需要真正的池,請(qǐng)繼續(xù)往下看。

(2)SyncTaskExecutor類

這個(gè)實(shí)現(xiàn)不會(huì)異步執(zhí)行。相反,每次調(diào)用都在發(fā)起調(diào)用的線程中執(zhí)行。它的主要用處是在不需要多線程的時(shí)候,比如簡(jiǎn)單的test case。

(3)ConcurrentTaskExecutor 類

這個(gè)實(shí)現(xiàn)是對(duì)Java 5 java.util.concurrent.Executor類的包裝。有另一個(gè)備選, ThreadPoolTaskExecutor類,它暴露了Executor的配置參數(shù)作為bean屬性。很少需要使用ConcurrentTaskExecutor, 但是如果ThreadPoolTaskExecutor不敷所需,ConcurrentTaskExecutor是另外一個(gè)備選。

(4)SimpleThreadPoolTaskExecutor 類

這個(gè)實(shí)現(xiàn)實(shí)際上是Quartz的SimpleThreadPool類的子類,它會(huì)監(jiān)聽Spring的生命周期回調(diào)。當(dāng)你有線程池,需要在Quartz和非Quartz組件中共用時(shí),這是它的典型用處。

(5)ThreadPoolTaskExecutor 類

它不支持任何對(duì)java.util.concurrent包的替換或者下行移植。Doug Lea和Dawid Kurzyniec對(duì)java.util.concurrent的實(shí)現(xiàn)都采用了不同的包結(jié)構(gòu),導(dǎo)致它們無(wú)法正確運(yùn)行。 這個(gè)實(shí)現(xiàn)只能在Java 5環(huán)境中使用,但是卻是這個(gè)環(huán)境中最常用的。它暴露的bean properties可以用來(lái)配置一個(gè)java.util.concurrent.ThreadPoolExecutor,把它包裝到一個(gè)TaskExecutor中。如果你需要更加先進(jìn)的類,比如ScheduledThreadPoolExecutor,我們建議你使用ConcurrentTaskExecutor來(lái)替代。

(6)TimerTaskExecutor類

這個(gè)實(shí)現(xiàn)使用一個(gè)TimerTask作為其背后的實(shí)現(xiàn)。它和SyncTaskExecutor的不同在于,方法調(diào)用是在一個(gè)獨(dú)立的線程中進(jìn)行的,雖然在那個(gè)線程中是同步的。

(7)WorkManagerTaskExecutor類

這個(gè)實(shí)現(xiàn)使用了CommonJ WorkManager作為其底層實(shí)現(xiàn),是在Spring context中配置CommonJ WorkManager應(yīng)用的最重要的類。和SimpleThreadPoolTaskExecutor類似,這個(gè)類實(shí)現(xiàn)了WorkManager接口,因此可以直接作為WorkManager使用。

案例

注冊(cè)TaskExecutor

@Configurationpublic class WebMvcConfigurerAdpter extends AbstractWebMvcConfigurerAdpter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { super.configureMessageConverters(converters); WafJsonMapper.getMapper().enable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS); } @Bean public TaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); return executor; }}

使用:

@Servicepublic class TaskService { @Autowired private TaskExecutor executor; public void execute() { executor.execute(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(1000); System.out.println('task running ...'); } catch (Exception e) { } } } }); }}

@RestController@RequestMapping(value = '/v0.1')public class TaskController { @Autowired private TaskService taskService; @RequestMapping() public Object execute() { taskService.execute(); Map res = new HashMap(); res.put('result', 'success'); return res; }}

程序不會(huì)等到10個(gè)線程都跑完才返回結(jié)果,不是阻塞程序,返回結(jié)果后,線程仍然在執(zhí)行。

案例:

ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();//線程池所使用的緩沖隊(duì)列poolTaskExecutor.setQueueCapacity(200);//線程池維護(hù)線程的最少數(shù)量poolTaskExecutor.setCorePoolSize(5);//線程池維護(hù)線程的最大數(shù)量poolTaskExecutor.setMaxPoolSize(1000);//線程池維護(hù)線程所允許的空閑時(shí)間poolTaskExecutor.setKeepAliveSeconds(30000);poolTaskExecutor.initialize();

<!-- 配置線程池 --><bean > <!-- 線程池維護(hù)線程的最少數(shù)量 --><span style='white-space:pre'> </span><property name ='corePoolSize' value ='5' /> <!-- 線程池維護(hù)線程所允許的空閑時(shí)間 --><span style='white-space:pre'> </span><property name ='keepAliveSeconds' value ='30000' /> <!-- 線程池維護(hù)線程的最大數(shù)量 --><span style='white-space:pre'> </span><property name ='maxPoolSize' value ='1000' /> <!-- 線程池所使用的緩沖隊(duì)列 --><span style='white-space:pre'> </span><property name ='queueCapacity' value ='200' /></bean>

ApplicationContext ctx = new ClassPathXmlApplicationContext('applicationContext.xml');ThreadPoolTaskExecutor poolTaskExecutor = (ThreadPoolTaskExecutor)ctx.getBean('taskExecutor');Thread udpThread = new Thread(udp);poolTaskExecutor.execute(udpThread);獲取當(dāng)前線程池活動(dòng)的線程數(shù):int count = poolTaskExecutor.getActiveCount();logger.debug('[x] - now threadpool active threads totalNum : ' +count);

配置解釋

當(dāng)一個(gè)任務(wù)通過(guò)execute(Runnable)方法欲添加到線程池時(shí):1、 如果此時(shí)線程池中的數(shù)量小于corePoolSize,即使線程池中的線程都處于空閑狀態(tài),也要?jiǎng)?chuàng)建新的線程來(lái)處理被添加的任務(wù)。2、 如果此時(shí)線程池中的數(shù)量等于 corePoolSize,但是緩沖隊(duì)列 workQueue未滿,那么任務(wù)被放入緩沖隊(duì)列。3、如果此時(shí)線程池中的數(shù)量大于corePoolSize,緩沖隊(duì)列workQueue滿,并且線程池中的數(shù)量小于maximumPoolSize,建新的線程來(lái)處理被添加的任務(wù)。4、 如果此時(shí)線程池中的數(shù)量大于corePoolSize,緩沖隊(duì)列workQueue滿,并且線程池中的數(shù)量等于maximumPoolSize,那么通過(guò) handler所指定的策略來(lái)處理此任務(wù)。也就是:處理任務(wù)的優(yōu)先級(jí)為:核心線程corePoolSize、任務(wù)隊(duì)列workQueue、最大線程 maximumPoolSize,如果三者都滿了,使用handler處理被拒絕的任務(wù)。5、 當(dāng)線程池中的線程數(shù)量大于 corePoolSize時(shí),如果某線程空閑時(shí)間超過(guò)keepAliveTime,線程將被終止。這樣,線程池可以動(dòng)態(tài)的調(diào)整池中的線程數(shù)。

到此這篇關(guān)于淺談spring 線程異步執(zhí)行的文章就介紹到這了,更多相關(guān)spring 線程異步執(zhí)行內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 精品视频 久久久 | 日韩美一区二区三区 | 久久www免费人成_看片高清 | 久草在线播放视频 | 国产综合久久一区二区三区 | 国产99高清一区二区 | 女人国产香蕉久久精品 | 午夜欧美成人香蕉剧场 | 中文字幕亚洲精品 | 国产精品午夜免费观看网站 | 一级女毛片 | 欧美乱大交xxxxx在线观看 | 成人欧美网站 | 美女视频黄a全部 | 国产精品毛片在线大全 | 视频二区 中文字幕 欧美 | 成人午夜久久精品 | 国产精品一区伦免视频播放 | 波多野结衣在线视频免费观看 | 欧美一级做 | 午夜爽爽性刺激一区二区视频 | 国产福利片在线 易阳 | 亚洲九九夜夜 | 国产成人微拍精品 | 国产视频综合 | 亚洲高清免费视频 | 日韩欧美自拍 | 成人午夜爽爽爽免费视频 | 欧美精品亚洲精品日韩一区 | 成人做爰视频www网站 | 高清精品一区二区三区一区 | 亚洲www.| 国产三a级日本三级日产三级 | 亚洲在线网址 | 国产精品久久久久久久久免费观看 | 日韩免费一级a毛片在线播放一级 | 久草在线国产 | 日韩欧美特级毛片 | 99色在线视频 | 国产成人精品高清在线 | 一级色黄|