安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

5种方法,教你判断线程池是否全部完成

1月1日 心碎巷投稿
  概述
  最近写小玩具的时候用到了CountDownLatch计数器,然后顺便想了想判断线程池全部结束有多少种方法。
  在网上搜了下,可能有些没找到,但是我找到的有(所有方法都是在ThreadPoolExecutor线程池方法下测试的):isTerminated()判断方式,在执行shutdown(),关闭线程池后,判断是否所有任务已经完成。ThreadPoolExecutor的getCompletedTaskCount()方法,判断完成任务数和全部任务数是否相等。CountDownLatch计数器,使用闭锁计数来判断是否全部完成。手动维护一个公共计数,原理和闭锁类似,就是更加灵活。使用submit向线程池提交任务,Future判断任务执行状态。
  好嘞,现在开始一个一个介绍优缺点和简要原理;
  先创建一个static线程池,后面好几个例子就不一一创建了,全部用这个就行了:创建一个最大线程数是20的线程池publicstaticThreadPoolExecutorpoolnewThreadPoolExecutor(10,20,0L,TimeUnit。MILLISECONDS,newLinkedBlockingQueue());
  然后再准备一个通用的睡眠方法:线程执行方法,随机等待0到10秒privatestaticvoidsleepMtehod(intindex){try{longsleepTimenewDouble(Math。random()10000)。longValue();Thread。sleep(sleepTime);System。out。println(当前线程执行结束:index);}catch(InterruptedExceptione){e。printStackTrace();}}
  这个方法就是为了测试的时候区分线程执行完毕的下顺序而已。
  好嘞,准备完毕,现在开始。isTerminated方式
  首先贴上测试代码:privatestaticvoidshutdownTest()throwsException{for(inti0;i30;i){pool。execute(()sleepMtehod(index));}pool。shutdown();while(!pool。isTerminated()){Thread。sleep(1000);System。out。println(还没停止);}System。out。println(全部执行完毕);}
  这一种方式就是在主线程中进行循环判断,全部任务是否已经完成。
  这里有两个主要方法:shutdown():启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。如果已经关闭,调用没有额外的作用。isTerminated():如果所有任务在关闭后完成,则返回true。请注意,isTerminated从不是true,除非shutdown或shutdownNow先被执行。
  通俗点讲,就是在执行全部任务后,对线程池进行shutdown()有序关闭,然后循环判断isTerminated(),线程池是否全部完成。优点:操作简单,代码更加简单。缺点:需要关闭线程池。一般我在代码中都是将线程池注入到Spring容器,然后各个组件中统一用同一个,当然不能关闭。
  类似方法扩展:shutdownNow():尝试停止所有主动执行的任务,停止等待任务的处理,并返回正在等待执行的任务列表。从此方法返回时,这些任务将从任务队列中删除。通过Thread。interrupt()取消任务。isShutdown():如果线程池已关闭,则返回true。isTerminating():如果在shutdown()或shutdownNow()之后终止,但尚未完全终止,则返回true。waitTermination(longtimeout,TimeUnitunit):当前线程阻塞,直到等所有已提交的任务(包括正在跑的和队列中等待的)执行完,或者等超时时间到,或者线程被中断抛出异常;全部执行完返回true,超时返回false。也可以用这个方法代替isTerminated()进行判断。getCompletedTaskCount
  还是一样,贴上代码:privatestaticvoidtaskCountTest()throwsException{for(inti0;i30;i){pool。execute(()sleepMtehod(index));}当线程池完成的线程数等于线程池中的总线程数while(!(pool。getTaskCount()pool。getCompletedTaskCount())){System。out。println(任务总数:pool。getTaskCount();已经完成任务数:pool。getCompletedTaskCount());Thread。sleep(1000);System。out。println(还没停止);}System。out。println(全部执行完毕);}
  还是一样在主线程循环判断,主要就两个方法:getTaskCount():返回计划执行的任务总数。由于任务和线程的状态可能在计算过程中动态变化,因此返回的值只是一个近似值。getCompletedTaskCount():返回完成执行的任务的大致总数。因为任务和线程的状态可能在计算过程中动态地改变,所以返回的值只是一个近似值,但是在连续的调用中并不会减少。
  这个好理解,总任务数等于已完成任务数,就表示全部执行完毕。优点:完全使用了ThreadPoolExecutor提供的方法,并且不必关闭线程池,避免了创建和销毁带来的损耗。缺点:上面的解释也看到了,使用这种判断存在很大的限制条件;必须确定,在循环判断过程中,没有新的任务产生。差不多意思就是,这个线程池只能在这条线程中使用。
  其他:
  最后扯两句,因为我用main方法运行的,跑完后main没有结束,是因为非守护线程如果不终止,程序是不会结束的。而线程池Worker线程里写了一个死循环,而且被设置成了非守护线程。CountDownLatch计数器
  这种方法是我比较常用的方法,先看代码:privatestaticvoidcountDownLatchTest()throwsException{计数器,判断线程是否执行结束CountDownLatchtaskLatchnewCountDownLatch(30);for(inti0;i30;i){pool。execute((){sleepMtehod(index);taskLatch。countDown();System。out。println(当前计数器数量:taskLatch。getCount());});}当前线程阻塞,等待计数器置为0taskLatch。await();System。out。println(全部执行完毕);}
  这种方法,呃,应该是看起来比较高级的,我也不知道别的大佬怎么写的,反正我就用这个。
  这个方法需要介绍下这个工具类CountDownLatch。先把这种方式的优缺点写了,后面再详细介绍这个类。优点:代码优雅,不需要对线程池进行操作,将线程池作为Bean的情况下有很好的使用场景。缺点:需要提前知道线程数量;性能确实,呃呃呃呃呃,差了点。哦对了,还需要在线程代码块内加上异常判断,否则在countDown之前发生异常而没有处理,就会导致主线程永远阻塞在await。CountDownLatch概述
  CountDownLatch是JDK提供的一个同步工具,它可以让一个或多个线程等待,一直等到其他线程中执行完成一组操作。
  常用的方法有countDown方法和await方法,CountDownLatch在初始化时,需要指定用给定一个整数作为计数器。
  当调用countDown方法时,计数器会被减1;当调用await方法时,如果计数器大于0时,线程会被阻塞,一直到计数器被countDown方法减到0时,线程才会继续执行。
  计数器是无法重置的,当计数器被减到0时,调用await方法都会直接返回。维护一个公共计数
  这种方式其实和CountDownLatch原理类似。
  先维护一个静态变量privatestaticinttaskNum0;
  然后在线程任务结束时,进行静态变量操作:privatestaticvoidstaticCountTest()throwsException{LocklocknewReentrantLock();for(inti0;i30;i){pool。execute((){sleepMtehod(index);lock。lock();taskNlock。unlock();});}while(taskNum30){Thread。sleep(1000);System。out。println(还没停止当前完成任务数:taskNum);}System。out。println(全部执行完毕);}
  其实就是加锁计数,循环判断。优点:手动维护方式更加灵活,对于一些特殊场景可以手动处理。缺点:和CountDownLatch相比,一样需要知道线程数目,但是代码实现比较麻烦,相对于灵活这一个优势,貌似投入产出并不对等。Future判断任务执行状态
  Future是用来装载线程结果的,不过,用这个来进行判断写代码总感觉怪怪的。
  因为Future只能装载一条线程的返回结果,多条线程总不能用List在接收Future。
  这里就开一个线程做个演示:privatestaticvoidfutureTest()throwsException{F?futurepool。submit(()sleepMtehod(1));while(!future。isDone()){Thread。sleep(500);System。out。println(还没停止);}System。out。println(全部执行完毕);}
  这种方式就不写优缺点了,因为Future的主要使用场景并不是用于判断任务执行状态。
  原文链接:https:mp。weixin。qq。comsll5RhZC2UlTOwgNenpr2VA
投诉 评论 转载

墨子号实现一千二百公里地表量子态传输记者从中国科学技术大学获悉,该校潘建伟院士及其同事彭承志、陈宇翱、印娟等利用墨子号量子科学实验卫星,首次实现了地球上相距1200公里两个地面站之间的量子态远程传输,向构建全球化……都说安卓的系统越用越卡,为什么vivo的手机还是可以保持那么安卓系统越用越卡这是很早就有的结论,我也一直深信不疑,因为我最开始用的安卓手机就非常卡顿,但我用了一部高端安卓手机后,彻底改变了这种看法,越到后面用的手机越多,就有了新的看法。……我们花两月测了测OPPOReno6Pro图源:IT时报30秒快读1。Reno是OPPO中端手机系列(高端是Find系列、低端为Ace系列),今年发布的是Reno6是目前OPPO市场热度比较高的机型。从低配到高配……今年出的新手机配置还不如旧手机?恐怕是真的最近啊,手机厂商们发布新手机的势头是一家比一家猛。前有摩托小米开路,后有步步高集团携一家老小(vivo、OPPO、realme、一加)纷至沓来,争相恐后的想要在新一年手机……中国卫星能力怎么样?迷彩虎军事为您回答,现讲个小段子吧,眼见着中国在高新技术领域就要打破美国一家独霸的地位了,最近的美国总统很不高兴要求中国立即停止中国制造2025计划。欸!中国人的事儿,和你们美……国产降噪耳机COWINApexPro评测高性价比不输国外大品近几年,真无线蓝牙耳机成为了最火爆,也最流行的数码产品。全球市场出货量总计6个亿。在这个个性化娱乐的时代,基本上年轻人人手一个TWS真无线蓝牙耳机了。那在这么多品类繁多的耳机中……怎么选购液晶电视机?本人在家电行业也从事过数年,基本也可以回答此类问题。细节和技木上讨论这一问题是很繁琐的,只能简单关注几个要点,这里所讲的是较高品质的产品。首先要选择主流一线品牌,了解市面……币价涨跌,确实可以让你一时暴富但对区块链的认知你却一无所知如果你永远只是在群里听消息炒币,满眼看到的都是资金盘、CX,满耳听到的都是一群疯疯癫癫,不知所云的人在没有逻辑的喊着十倍百倍千倍那么,当币价下跌、腰斩的时候,你就会很容易的得出……5种方法,教你判断线程池是否全部完成概述最近写小玩具的时候用到了CountDownLatch计数器,然后顺便想了想判断线程池全部结束有多少种方法。在网上搜了下,可能有些没找到,但是我找到的有(所有方法……LinuxShell教程想玩转linux就请一直看下去Shell教程Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell是指一种应用程序,这个应……起售价低于8万元,2021款大众宝来哪个款配置更适合你?尽管是一款紧凑型家轿,但大众宝来凭借着积累的人气和口碑,在销量排行榜上依旧位居前列。对于相当一部分消费者来说,宝来确实更注重实用性。目前,据编者了解到,北京地区大众宝来优惠3。……centos如何定位到某一行?centos怎么定位到某一行使用vim的过程中想要快速移动光标至行首、行尾、第一行、最后一行或者某一行,本文对此简单介绍。1。快速至当前行的行首:home键最简单……
穷追不舍,共和党议员要求将前华为手机业务荣耀列入实体清单名单以变制变,中兴通讯蓄力下一战略周期能不能分享一张你手机相册里最美的日出或日落的照片?网商银行已死?其实你没看懂网商银行的定位是什么洗碗机真的靠谱吗?云米家的洗碗机怎么样?中国电信构筑5G核心能力为千行百业赋能赋智赋值为什么有人说电商破坏了整个商业生态,你怎么看?网贷究竟对老百姓有好处吗?集成电路学科博士点,江苏3所高校上榜,4所电子科大仅缺席1所如何实现开源电话系统FusionPBX的话机自动部署排查京东方A,TCL科技复盘反弹一日游,面板双雄明天怎么走?买了苹果x几年了,现在好像面部识别坏了,还能用几年勿谓言之不预!英航母犯我南海,解放军布下口袋阵,用炮弹相迎关于芙蓉花的说明文资产负债表与其嫉妒,不如欣赏卫生工作计划明天我在哪里世界上最大的山洞全球的人都在里面也可以装得下生活中有哪些智能小家电,让你买过后觉得非常值,幸福感超强?秦始皇陵墓扫描有活物霍金猜测秦始皇活着纯属谣言单位合同北方局部寒潮预警,西伯利亚冷涡出击!权威预报大降温超10度新疆长寿村现在年龄最大的是多少

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利