关系经济人类预测化学自然
投稿投诉
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产

以为很熟悉CountDownLatch的使用了,没想到在生产

1月21日 眸中星投稿
  前言
  大家好,我是小郭,之前分享了CountDownLatch的使用,我们知道用来控制并发流程的同步工具,主要的作用是为了等待多个线程同时完成任务后,在进行主线程任务。
  万万没想到,在生产环境中竟然翻车了,因为没有考虑到一些场景,导致了CountDownLatch出现了问题,接下来来分享一下由于CountDownLatch导致的问题。需求背景
  先简单介绍下业务场景,针对用户批量下载的文件进行修改上传
  为了提高执行的速度,所以在采用线程池去执行下载修改上传的操作,并在全部执行完之后统一提交保存文件地址到数据库,于是加入了CountDownLatch来进行控制。具体实现
  根据服务本身情况,自定义一个线程池publicstaticExecutorServicetestExtcutor(){returnnewThreadPoolExecutor(2,2,0L,TimeUnit。SECONDS,newLinkedBlockingQueue(1));}复制代码
  模拟执行publicstaticvoidmain(String〔〕args){下载文件总数ListIntegerresultListnewArrayList(100);IntStream。range(0,100)。forEach(resultList::add);下载文件分段ListListIntegersplitCollUtil。split(resultList,10);ExecutorServiceexecutorServiceBaseThreadPoolExector。testExtcutor();CountDownLatchcountDownLatchnewCountDownLatch(100);for(ListIntegerlist:split){executorService。execute((){list。forEach(i{try{模拟业务操作Thread。sleep(500);System。out。println(任务进入);}catch(InterruptedExceptione){e。printStackTrace();System。out。println(e。getMessage());}finally{System。out。println(countDownLatch。getCount());countDownLatch。countDown();}});});}try{countDownLatch。await();System。out。println(countDownLatch。await());}catch(InterruptedExceptione){e。printStackTrace();}}复制代码
  一开始我个人感觉没有什么问题,反正finally都能够做减一的操作,到最后调用await方法,进行主线程任务Exceptioninthreadmainjava。util。concurrent。RejectedExecutionException:Taskjava。util。concurrent。FutureTask300ffa5drejectedfromjava。util。concurrent。ThreadPoolExecutor1f17ae12〔Running,poolsize2,activethreads2,queuedtasks1,completedtasks0〕atjava。util。concurrent。ThreadPoolExecutorAbortPolicy。rejectedExecution(ThreadPoolExecutor。java:2063)atjava。util。concurrent。ThreadPoolExecutor。reject(ThreadPoolExecutor。java:830)atjava。util。concurrent。ThreadPoolExecutor。execute(ThreadPoolExecutor。java:1379)atjava。util。concurrent。AbstractExecutorService。submit(AbstractExecutorService。java:112)atThread。executor。executorTestBlock。main(executorTestBlock。java:28)任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown任务进入countDownLatch。countDown复制代码
  由于任务数量较多,阻塞队列中已经塞满了,所以默认的拒绝策略,当队列满时,处理策略报错异常,
  要注意这个异常是线程池,自己抛出的,不是我们循环里面打印出来的,
  这也造成了,线上这个线程池被阻塞了,他永远也调用不到await方法,
  利用jstack,我们就能够看到有问题pool1thread212prio5osprio31tid0x00007ff6198b7000nid0xa903waitingoncondition〔0x0000700001c64000〕java。lang。Thread。State:WAITING(parking)atsun。misc。Unsafe。park(NativeMethod)parkingtowaitfor0x000000076b2283f8(ajava。util。concurrent。locks。AbstractQueuedSynchronizerConditionObject)atjava。util。concurrent。locks。LockSupport。park(LockSupport。java:175)atjava。util。concurrent。locks。AbstractQueuedSynchronizerConditionObject。await(AbstractQueuedSynchronizer。java:2039)atjava。util。concurrent。LinkedBlockingQueue。take(LinkedBlockingQueue。java:442)atjava。util。concurrent。ThreadPoolExecutor。getTask(ThreadPoolExecutor。java:1074)atjava。util。concurrent。ThreadPoolExecutor。runWorker(ThreadPoolExecutor。java:1134)atjava。util。concurrent。ThreadPoolExecutorWorker。run(ThreadPoolExecutor。java:624)atjava。lang。Thread。run(Thread。java:748)pool1thread111prio5osprio31tid0x00007ff6198b6800nid0x5903waitingoncondition〔0x0000700001b61000〕java。lang。Thread。State:WAITING(parking)atsun。misc。Unsafe。park(NativeMethod)parkingtowaitfor0x000000076b2283f8(ajava。util。concurrent。locks。AbstractQueuedSynchronizerConditionObject)atjava。util。concurrent。locks。LockSupport。park(LockSupport。java:175)atjava。util。concurrent。locks。AbstractQueuedSynchronizerConditionObject。await(AbstractQueuedSynchronizer。java:2039)atjava。util。concurrent。LinkedBlockingQueue。take(LinkedBlockingQueue。java:442)atjava。util。concurrent。ThreadPoolExecutor。getTask(ThreadPoolExecutor。java:1074)atjava。util。concurrent。ThreadPoolExecutor。runWorker(ThreadPoolExecutor。java:1134)atjava。util。concurrent。ThreadPoolExecutorWorker。run(ThreadPoolExecutor。java:624)atjava。lang。Thread。run(Thread。java:748)解决方案调大阻塞队列,但是问题来了,到底多少阻塞队列才是大呢,如果太大了会不由又造成内存溢出等其他的问题在第一个的基础上,我们修改了拒绝策略,当触发拒绝策略的时候,用调用者所在的线程来执行任务publicstaticThreadPoolExecutorqueueExecutor(BlockingQueueworkQueue){returnnewThreadPoolExecutor(size,size,0L,TimeUnit。SECONDS,workQueue,newThreadPoolExecutor。CallerRunsPolicy());}复制代码你可能又会想说,会不会任务数量太多,导致调用者所在的线程执行不过来,任务提交的性能急剧下降那我们就应该自定义拒绝策略,将这下排队的消息记录下来,采用补偿机制的方式去执行同时也要注意上面的那个异常是线程池抛出来的,我们自己也需要将线程池进行trycatch,记录问题数据,并且在finally中执行countDownLatch。countDown来避免,线程池的使用总结
  目前根据业务部门的反馈,业务实际中任务数不很特别多的情况,所以暂时先采用了第二种方式去解决这个线上问题
  在这里我们也可以看到,如果没有正确的关闭countDownLatch,可能会导致一直等待,这也是我们需要注意的。
  工具虽然好,但是依然要注意他带来的问题,没有正确的去处理好,引发的一系列连锁反应。
投诉 评论 转载

曾志伟儿子比老爸有魅力!长相帅气穿衣有品,长着一双深情眼男性的魅力,总是体现在一些容易被忽略的地方,相比起帅气的容颜和挺拔的身姿,真正有魅力的男性,最吸引人的地方还是品味!就好比曾志伟的儿子曾国祥,不仅在名校毕业而且是导演又是演员,……冯巩总结男足一句话上热搜第一,球迷惹讲小品的干什么?中国足坛近日与小品界出现了隔空对话,冯潇霆与巩汉林的冯巩之争引发了热议。近日,冯巩的一则小品段子突然在网络上流行,内容谈到了中国男足,直接让冯巩冲上了热搜榜第一名,也是令不少冯……只差30亿美元!马斯克即将超越LV创始人重回世界首富【CNMO新闻】在经历了过去半年财富大幅缩水的情况后,特斯拉首席执行官埃陇马斯克(ElonMusk)似乎正朝着重新夺回按净值计算的世界最富之人这一头衔的方向迈进。马斯克……虚拟电厂这一概念迎来爆炒,那么虚拟电厂究竟是什么?目前,我国电力系统主要是以火力发电为主,水电、风电、光伏发电、核电等发电形式作为补充的一个系统。在碳中和的这个宏大背景下,未来十年,中国能源将实现两个目标:一是到2020……花2年研发的牛牛智造协同平台,也许我错了理想是好的,现实是残酷的,雷军说梦想要有的,万一实现了呢?为此坚持了两年,从架构设计到开发、测试,从头到尾都是我一个人搞定,这其中的辛酸只有自己懂。我是一名活跃在智能硬件……孩子矮小症?可能是没抓住三个黄金期还没到14岁,怎么就说长不高了?孩子每天吃喝的营养很丰富,为什么就是不长个?清远市人民医院生长发育专科每天都要面对家长的各种提问。张凌丽。该科主治医师张凌丽提醒,如……夏天食欲不振怎么办?吃这些帮你开胃一到夏天有些人会出现食欲不振的情况中医认为在盛夏可以适当吃一些苦味的食物有清热消暑、清心降火增进食欲的作用小编给大家推荐几种适合夏天吃……面向云场景的高速数字签名应用研究与实践摘要随着信息化技术的不断发展,云计算已经成为新一代产业和业务模式变革的焦点,云计算的虚拟化、多租户、弹性计算等特点对密码应用提出了更高的要求,除了租户化与服务化地提供密码……以为很熟悉CountDownLatch的使用了,没想到在生产前言大家好,我是小郭,之前分享了CountDownLatch的使用,我们知道用来控制并发流程的同步工具,主要的作用是为了等待多个线程同时完成任务后,在进行主线程任务。……精致好听真无线耳机,带来安静睡眠环境,SampampampO平时工作还有休息的时候,大家对周围的环境噪音都会非常敏感,所以支持主动降噪的真无线耳机这两年很受欢迎,戴上之后可以大幅削弱恼人的噪音。前些天我发现了一款设计很特别的耳机,叫做魔……重回CBA!周琦跌出轮换,他在NBL都学到了什么?周琦在去年加盟NBL联赛时,引起了国内球迷的一阵热烈讨论,一部分球迷认为离开CBA去更高级别的联赛对于周琦的技术有提升,能够更好的提升竞技状态,甚至冲击NBA的舞台。但也有一部……林高远30获世乒赛资格,赛后发言令人佩服,刘国梁没看错人众所周知,最近成都世乒赛的的备战备受大家的关注,大家非常的想了解,最终获得世乒赛参赛的团体名单的球员到底有可能是谁?此前根据世乒赛官宣的规则可以了解到,国乒在男团方面已经……
美团上可以买了美团不断跨界新零售想干啥脐带绕颈会导致胎儿窒息吗修炼造句用修炼造句大全茶具的使用各位船员,您有一封海事情书待查收游资打板战法实盘进阶二十八打首板最难雨后湖边的旋律广西漠川乡最佳赏银杏时间母乳与辅食的搭配原则浅谈如何做好技工学校的班主任量子互联网迎来巨大飞跃科学家推出全球首台新设备助推量子时代从在方剂中的应用看浙贝母川贝母功效差别

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找菏泽德阳山西湖州宝鸡上海茂名内江三亚信阳长春北海西安安徽黄石烟台沧州湛江肇庆鹤壁六安韶关成都钦州