countdownlatch是线程同步吗,

  countdownlatch是线程同步吗,

  00-1010核心方法CountDownLatch介绍如何使用CountDownLatch运行流程应用场景汇总

  

目录
CountDownLatch是一个多线程同步工具类。在多线程环境中,它允许多个线程等待,直到前一个线程完成执行。从类名上看,倒数意味着数量递减,我们可以理解为计数器。

  00-1010COUNTDOWN():计数器递减方法。Await():使调用此方法的线程等待,直到计数器计数到0,主线程才会醒来。Await(long,TimeUnit):在Await()方法的基础上,增加了一个超时策略。如果等待超时后没有结果,直接唤醒主线程。

  

简介

在这里我们用一段简单的代码进行演示:

  @Slf4jpublic类CountDownLatchDemo { public static void main(String[]args)throws interrupted exception { CountDownLatch CountDownLatch=new CountDownLatch(3);新线程(()-{ log . info( hello this is Thread one );试试{ TimeUnit。seconds . sleep;} catch(interrupted exception e){ e . printstacktrace();} countdownlatch . count down();}).start();新线程(()- { log.info(你好这是线程二);countdownlatch . count down();}).start();新线程(()- { log.info(你好这是线程三);countdownlatch . count down();}).start();countdownlatch . await();log.info(说再见!);}}从上面的代码可以看出,我们为3和三个线程同步运行创建了CountDownLatch计数器。在主线程中调用countDownLatch.await()方法来阻塞主线程。三个线程都会调用countDownLatch.countDown()方法来递减计数器,在三个线程都完成任务后,当计数器值为0时,主线程就会被唤醒。

  当注:创建CountDownLatch实例时,需要定义计数器值。一般比较合理的用法是,这个值的定义需要合理计算,使计数值等于需要并行的线程数。每执行一个线程后,计数递减,最后唤醒主线程继续执行。

  如果CountDownLatch的计数值设置为大于线程数,那么所有线程最终都会完成,如果count递减为0,主线程会一直等待。如果CountDownLatch的计数值被设置为小于并发线程的数量,则在一些线程完成执行之前,计数可能被递减到0,并且主线程将被提前唤醒。

  00-1010如下图所示,主线程阻塞和唤醒的核心是计数器。只有当所有线程执行完毕,计数一个一个递减,await()阻塞中的主线程才会被唤醒。

  注:await()可以阻塞一个或多个线程。如果它阻塞多个线程,当计数为0时,它将唤醒所有被阻塞的线程。

  00-1010简单了解CountDow后

  nLatch的作用后,相信各位最终目的还是想了解如何去使用,在哪些场景下使用更加合适,接下来我就拿一个对账业务的场景详细分析一下。

  相信现在很多平台都会对接银联、微信、支付宝等支付渠道做交易,那么在这样的场景下对账是不可避免的。对账通常都会在每日的凌晨去处理,一方面是凌晨时间点多数平台访问量都会较小,服务器压力也比较轻松,而且此时出账也比较合理,所以在这个时间点做对账也是一个大数据量计算的操作。

  上面讲这么多好像都没说到重点,在处理对账之前首先我们肯定是需要通过各个支付渠道获取对账单文件,那么该如何操作呢?

  对账文件下载(第一阶段):在这种情况下可以设计三个任务并发去获取对账文件,使用CountDownLatch阻塞主线程,等待三个任务都获取到文件的时候做计数递减,最终唤醒主线将标记本阶段处理完成,并发起进入下一阶段的通知。对账文件解析(第二阶段):在上个阶段已下载完成的文件文件中,此阶段要做的就是解析文件。由于三个渠道都是不同的厂家那么文件的内容格式肯定都是不一样的,这时候我们又可以使用CountDownLatch启动三个线程分别去解析各自的对账文件,最终将文件内容转换为业务所需的数据统一格式入库,在三个任务都入库完成后主线程又被唤醒标记完成后,通知下一阶段开始进入工作。对账结算(第三阶段):在上一阶段的数据入库完成后,此阶段要做的就是比对每一笔交易是否准确,一般都是按单号与交易渠道比对交易的金额是否一致,如果金额一致则该笔交易结算成功,否则将交易判定为异常交易,并入库处理。由上面的流程分析我们就可以设计相对合理的CountDownLatch计数,结合Semaphore信号量控制并发量同时对对比交易单做并发处理,最终带所有交易单处理完成后唤醒主线程标记对账完成,并通知下一阶段进行出账。出账(第四阶段):通常平台在对账完成后会进行出账,也就是按照平台的业务规则出具相关的账单方便财务人员进行统计。

  

总结

多线程并发的情况下需要做好同步处理,结合CountDownLatch充分的运用到业务场景当中还是挺有必要的,凡是需要在多个任务执行完成后再去做另一件事的情况都可以考虑使用CountDownLatch,合理使用但请不要滥用,特别上面也提到过计数值需要确定,否则可能导致多任务无法做到同步甚至造成主线程无限等待。

  到此这篇关于Java多线程同步工具类CountDownLatch详解的文章就介绍到这了,更多相关Java CountDownLatch内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: