/** Ċ Ġ* ĠCopyright Ġ 2 0 1 0 Ġ- Ġ 2 0 2 0 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ package Ġjet brains . ex od us . core . execution Ċ Ċ import Ġjet brains . ex od us . core . data Structures . decorators . Queue Decorator Ċ import Ġjet brains . ex od us . core . data Structures . hash . HashSet Ċ import Ġmu . K Logging Ċ Ċ /** Ċ Ġ* ĠShared Ġtimer Ġruns Ġregistered Ġperiodic Ġtasks Ġ( each Ġsecond ) Ġin Ġlock - free Ġmanner . Ċ Ġ*/ Ċ object ĠShared Timer Ġ: ĠK Logging () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠPER IOD Ġ= Ġ 1 0 0 0 Ġ// Ġin Ġmilliseconds ĊĠĠĠ Ġprivate Ġval Ġregistered Tasks : ĠMutable Set < Exp irable Periodic Task > ĊĠĠĠ Ġprivate Ġval Ġprocessor : ĠJob Processor ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġregistered Tasks Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġprocessor Ġ= ĠThread Job Processor Pool . get OrCreate Job Processor (" Ex od us Ġshared Ġtimer Ġthread ") ĊĠĠĠĠĠĠĠ Ġprocessor . queue In ( Ticker (), ĠPER IOD . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġregister Periodic Task ( task : ĠExp irable Periodic Task ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessor . queue ( object Ġ: ĠJob () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistered Tasks . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġregister Periodic Task In ( task : ĠExp irable Periodic Task , Ġmillis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessor . queue In ( object Ġ: ĠJob () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistered Tasks . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġmillis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġunregister Periodic Task ( task : ĠExp irable Periodic Task ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessor . queue ( object Ġ: ĠJob () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistered Tasks . remove ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġensure Idle () Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessor . waitFor Jobs ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠExp irable Periodic Task Ġ: ĠRunnable Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġis Expired : ĠBoolean ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠT icker Ġ: ĠJob () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Tick Ġ= ĠSystem . currentTimeMillis () Ġ+ ĠPER IOD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpired Tasks Ġ= ĠQueue Decorator < Exp irable Periodic Task >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistered Tasks . forEach Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Expired ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpired Tasks . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Periodic Ġtask Ġfailure ", Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( expired Task Ġin Ġexpired Tasks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregistered Tasks . remove ( expired Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . queue At ( this , Ġnext Tick ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }