/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 2 1 ĠPaul ĠAmb rose Ġ( p amb rose @ mac . com ) Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" Un document ed Public Class ", Ġ" Un document ed Public Function ") Ċ Ċ package Ġio . etcd . recipes . examples . barrier Ċ Ċ import Ġcom . github . p amb rose . common . util . random Ċ import Ġcom . github . p amb rose . common . util . sleep Ċ import Ġio . etcd . recipes . barrier . Distributed Double Barrier Ċ import Ġio . etcd . recipes . barrier . with Distributed Double Barrier Ċ import Ġio . etcd . recipes . common . connect To Et cd Ċ import Ġio . etcd . recipes . common . delete Children Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġkotlin . concurrent . thread Ċ import Ġkotlin . time . Duration Ċ Ċ fun Ġmain () Ġ{ ĊĠ Ġval Ġurls Ġ= ĠlistOf (" http :// localhost : 2 3 7 9 ") ĊĠ Ġval Ġbarrier Path Ġ= Ġ"/ bar riers / double bar ri ert est " ĊĠ Ġval Ġcount Ġ= Ġ 5 ĊĠ Ġval Ġenter Latch Ġ= ĠCount DownLatch ( count Ġ- Ġ 1 ) ĊĠ Ġval Ġleave Latch Ġ= ĠCount DownLatch ( count Ġ- Ġ 1 ) ĊĠ Ġval Ġdone Latch Ġ= ĠCount DownLatch ( count ) ĊĊĠ Ġfun Ġenter Barrier ( id : ĠInt , Ġbarrier : ĠDistributed Double Barrier , Ġretry Count : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠ Ġsleep ( Duration . seconds ( 1 0 . random ())) ĊĊĠĠĠ Ġrepeat ( retry Count ) Ġ{ ĊĠĠĠĠĠ Ġprintln ("# $ id ĠWaiting Ġto Ġenter Ġbarrier ") ĊĠĠĠĠĠ Ġbarrier . enter ( Duration . seconds ( 2 )) ĊĠĠĠĠĠ Ġprintln ("# $ id ĠTime d Ġout Ġentering Ġbarrier ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenter Latch . count Down () ĊĊĠĠĠ Ġprintln ("# $ id ĠWaiting Ġto Ġenter Ġbarrier ") ĊĠĠĠ Ġbarrier . enter () ĊĠĠĠ Ġprintln ("# $ id ĠEnter ed Ġbarrier ") ĊĠ Ġ} ĊĊĠ Ġfun Ġleave Barrier ( id : ĠInt , Ġbarrier : ĠDistributed Double Barrier , Ġretry Count : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠ Ġsleep ( Duration . seconds ( 1 0 . random ())) ĊĊĠĠĠ Ġrepeat ( retry Count ) Ġ{ ĊĠĠĠĠĠ Ġprintln ("# $ id ĠWaiting Ġto Ġleave Ġbarrier ") ĊĠĠĠĠĠ Ġbarrier . leave ( Duration . seconds ( 2 )) ĊĠĠĠĠĠ Ġprintln ("# $ id ĠTime d Ġout Ġleaving Ġbarrier ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġleave Latch . count Down () ĊĊĠĠĠ Ġprintln ("# $ id ĠWaiting Ġto Ġleave Ġbarrier ") ĊĠĠĠ Ġbarrier . leave () ĊĠĠĠ Ġprintln ("# $ id ĠLeft Ġbarrier ") ĊĠĠĠ Ġdone Latch . count Down () ĊĠ Ġ} ĊĊĠ Ġconnect To Et cd ( urls ) Ġ{ Ġclient Ġ-> ĊĠĠĠ Ġclient . delete Children ( barrier Path ) ĊĠ Ġ} ĊĊĠ Ġrepeat ( count Ġ- Ġ 1 ) Ġ{ Ġi Ġ-> ĊĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠ Ġconnect To Et cd ( urls ) Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠ Ġwith Distributed Double Barrier ( client , Ġbarrier Path , Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġenter Barrier ( i , Ġthis , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠ Ġsleep ( Duration . seconds ( 5 . random ())) ĊĠĠĠĠĠĠĠĠĠ Ġleave Barrier ( i , Ġthis , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġconnect To Et cd ( urls ) Ġ{ Ġclient Ġ-> ĊĠĠĠ Ġwith Distributed Double Barrier ( client , Ġbarrier Path , Ġcount ) Ġ{ ĊĠĠĠĠĠ Ġenter Latch . await () ĊĠĠĠĠĠ Ġsleep ( Duration . seconds ( 2 )) ĊĠĠĠĠĠ Ġenter Barrier ( 9 9 , Ġthis ) ĊĊĠĠĠĠĠ Ġleave Latch . await () ĊĠĠĠĠĠ Ġsleep ( Duration . seconds ( 2 )) ĊĠĠĠĠĠ Ġleave Barrier ( 9 9 , Ġthis ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġdone Latch . await () ĊĊĠ Ġprintln (" Done ") Ċ }