电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

淺談Java中spring 線程異步執行

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

多線程并發處理起來通常比較麻煩,如果你使用spring容器來管理業務bean,事情就好辦了多了。spring封裝了Java的多線程的實現,你只需要關注于并發事物的流程以及一些并發負載量等特性,具體來說如何使用spring來處理并發事務:

1.了解 TaskExecutor接口

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

2. TaskExecutor接口的實現類

(1)SimpleAsyncTaskExecutor 類

這個實現不重用任何線程,或者說它每次調用都啟動一個新線程。但是,它還是支持對并發總數設限,當超過線程并發總數限制時,阻塞新的調用,直到有位置被釋放。如果你需要真正的池,請繼續往下看。

(2)SyncTaskExecutor類

這個實現不會異步執行。相反,每次調用都在發起調用的線程中執行。它的主要用處是在不需要多線程的時候,比如簡單的test case。

(3)ConcurrentTaskExecutor 類

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

(4)SimpleThreadPoolTaskExecutor 類

這個實現實際上是Quartz的SimpleThreadPool類的子類,它會監聽Spring的生命周期回調。當你有線程池,需要在Quartz和非Quartz組件中共用時,這是它的典型用處。

(5)ThreadPoolTaskExecutor 類

它不支持任何對java.util.concurrent包的替換或者下行移植。Doug Lea和Dawid Kurzyniec對java.util.concurrent的實現都采用了不同的包結構,導致它們無法正確運行。 這個實現只能在Java 5環境中使用,但是卻是這個環境中最常用的。它暴露的bean properties可以用來配置一個java.util.concurrent.ThreadPoolExecutor,把它包裝到一個TaskExecutor中。如果你需要更加先進的類,比如ScheduledThreadPoolExecutor,我們建議你使用ConcurrentTaskExecutor來替代。

(6)TimerTaskExecutor類

這個實現使用一個TimerTask作為其背后的實現。它和SyncTaskExecutor的不同在于,方法調用是在一個獨立的線程中進行的,雖然在那個線程中是同步的。

(7)WorkManagerTaskExecutor類

這個實現使用了CommonJ WorkManager作為其底層實現,是在Spring context中配置CommonJ WorkManager應用的最重要的類。和SimpleThreadPoolTaskExecutor類似,這個類實現了WorkManager接口,因此可以直接作為WorkManager使用。

案例

注冊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; }}

程序不會等到10個線程都跑完才返回結果,不是阻塞程序,返回結果后,線程仍然在執行。

案例:

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

<!-- 配置線程池 --><bean > <!-- 線程池維護線程的最少數量 --><span style='white-space:pre'> </span><property name ='corePoolSize' value ='5' /> <!-- 線程池維護線程所允許的空閑時間 --><span style='white-space:pre'> </span><property name ='keepAliveSeconds' value ='30000' /> <!-- 線程池維護線程的最大數量 --><span style='white-space:pre'> </span><property name ='maxPoolSize' value ='1000' /> <!-- 線程池所使用的緩沖隊列 --><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);獲取當前線程池活動的線程數:int count = poolTaskExecutor.getActiveCount();logger.debug('[x] - now threadpool active threads totalNum : ' +count);

配置解釋

當一個任務通過execute(Runnable)方法欲添加到線程池時:1、 如果此時線程池中的數量小于corePoolSize,即使線程池中的線程都處于空閑狀態,也要創建新的線程來處理被添加的任務。2、 如果此時線程池中的數量等于 corePoolSize,但是緩沖隊列 workQueue未滿,那么任務被放入緩沖隊列。3、如果此時線程池中的數量大于corePoolSize,緩沖隊列workQueue滿,并且線程池中的數量小于maximumPoolSize,建新的線程來處理被添加的任務。4、 如果此時線程池中的數量大于corePoolSize,緩沖隊列workQueue滿,并且線程池中的數量等于maximumPoolSize,那么通過 handler所指定的策略來處理此任務。也就是:處理任務的優先級為:核心線程corePoolSize、任務隊列workQueue、最大線程 maximumPoolSize,如果三者都滿了,使用handler處理被拒絕的任務。5、 當線程池中的線程數量大于 corePoolSize時,如果某線程空閑時間超過keepAliveTime,線程將被終止。這樣,線程池可以動態的調整池中的線程數。

到此這篇關于淺談spring 線程異步執行的文章就介紹到這了,更多相關spring 線程異步執行內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 视觉检测设备_自动化检测设备_CCD视觉检测机_外观缺陷检测-瑞智光电 | 电子书导航网_电子书之家_电子书大全_最新电子书分享发布平台 | LNG鹤管_内浮盘价格,上装鹤管,装车撬厂家-连云港赛威特机械 | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | PE一体化污水处理设备_地埋式生活污水净化槽定制厂家-岩康塑业 | 拉伸膜,PE缠绕膜,打包带,封箱胶带,包装膜厂家-东莞宏展包装 | 球盟会·(中国)官方网站| 健康管理师报名入口,2025年健康管理师考试时间信息网-网站首页 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 钢格板_钢格栅_格栅板_钢格栅板 - 安平县鑫拓钢格栅板厂家 | 奶茶加盟,奶茶加盟店连锁品牌-甜啦啦官网 | 致胜管家软件服务【在线免费体验】 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 范秘书_懂你的范文小秘书| 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 刑事律师_深圳著名刑事辩护律师_王平聚【清华博士|刑法教授】 | 天津仓储物流-天津电商云仓-天津云仓一件代发-博程云仓官网 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 盘古网络技术有限公司| 自动部分收集器,进口无油隔膜真空泵,SPME固相微萃取头-上海楚定分析仪器有限公司 | 变频器维修公司_plc维修_伺服驱动器维修_工控机维修 - 夫唯科技 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | EPK超声波测厚仪,德国EPK测厚仪维修-上海树信仪器仪表有限公司 | 氢氧化钙设备_厂家-淄博工贸有限公司 | 辽宁资质代办_辽宁建筑资质办理_辽宁建筑资质延期升级_辽宁中杭资质代办 | 沈阳建筑设计公司_加固改造设计_厂房设计_设计资质加盟【金辉设计】 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 | 达利园物流科技集团- | 北京浩云律师事务所-法律顾问_企业法务_律师顾问_公司顾问 | 物流公司电话|附近物流公司电话上门取货| 橡胶弹簧|复合弹簧|橡胶球|振动筛配件-新乡市永鑫橡胶厂 | 领先的大模型技术与应用公司-中关村科金 | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 南京精锋制刀有限公司-纵剪机刀片_滚剪机刀片_合金刀片厂家 | 压力变送器-上海武锐自动化设备有限公司 | 方源木业官网-四川木门-全国木门专业品牌 | pbt头梳丝_牙刷丝_尼龙毛刷丝_PP塑料纤维合成毛丝定制厂_广州明旺 | 爆炸冲击传感器-无线遥测传感器-航天星百科 |