/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ Ġ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 Ġcom . ant . lib _ rx . internal . schedul ers Ċ Ċ import Ġcom . ant . lib _ rx . Scheduler Ċ import Ġcom . ant . lib _ rx . dis pos ables . Disposable Ċ import Ġcom . ant . lib _ rx . internal . dis pos ables . Composite Disposable Ċ import Ġcom . ant . lib _ rx . internal . fuse able . Empty Disposable Ċ import Ġjava . util . concurrent .* Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ /** Ċ Ġ* Ġ< p > ------------------------------------------------ ------ Ċ Ġ* Ġ< p > Copyright Ġ( C ) Ġ 2 0 2 0 Ġwas u Ġcompany , ĠAll Ġrights Ġreserved . Ċ Ġ* Ġ< p > ------------------------------------------------ ------ Ċ Ġ* Ġ< p > Ċ Ġ* Ġ< p > Ċ Ġ* Ċ Ġ* Ġ@ author ĠAnt Ċ Ġ* Ġ@ date Ġon ĠĠ 2 0 2 0 / 1 1 / 1 7 Ġ 1 4 : 2 8 . Ċ Ġ*/ Ċ class ĠSingle Scheduler ( private Ġval Ġthread Factory : ĠThread Factory Ġ= ĠS INGLE _ THREAD _ FACTORY ) Ġ: ĊĠĠĠ ĠScheduler () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çº¿ç¨ĭ å®īåħ¨ ĠéľĢè¦ģ åĪĽå»ºä¸Ģä¸ª åģľæŃ¢ è¿Ĳè¡Į çļĦ çº¿ç¨ĭ æ±ł ä½ľä¸º shutdown æłĩè®° ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġexecutor Ġ= ĠAtomic Reference < Scheduled ExecutorService >() ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠKEY _ SINGLE _ PRIORITY Ġ= Ġ" rx . single - priority " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTHREAD _ NAME _ PREFIX Ġ= Ġ" Rx Single Scheduler " ĊĊĠĠĠĠĠĠĠ Ġval ĠS INGLE _ THREAD _ FACTORY : ĠThread Factory ĊĊĠĠĠĠĠĠĠ Ġval ĠSH UT DOWN : ĠScheduled ExecutorService Ġ= ĠExec utors . new Scheduled ThreadPool ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSH UT DOWN . shutdown () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpriority Ġ= ĠThread . MAX _ PRIORITY . coerce At Most ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger . getInteger ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ SINGLE _ PRIORITY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . NORM _ PRIORITY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS INGLE _ THREAD _ FACTORY Ġ= ĠRx Thread Factory ( THREAD _ NAME _ PREFIX , Ġpriority , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Executor ( factory : ĠThread Factory ): ĠScheduled ExecutorService Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠScheduler Pool Factory . create ( factory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutor . lazy Set ( create Executor ( thread Factory )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnext : ĠScheduled ExecutorService ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġexecutor . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ!= ĠSH UT DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext ?. shutdown () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġcreate Executor ( thread Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( executor . compare AndSet ( current , Ġnext )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshutdown () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġexecutor . get () ĊĠĠĠĠĠĠĠ Ġif Ġ( current Ġ!= ĠSH UT DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġexecutor . get AndSet ( SHUT DOWN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ!= ĠSH UT DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . shutdown Now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Worker (): ĠWorker Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠScheduled Worker ( executor . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġschedule Direct ( run : ĠRunnable , Ġdelay : ĠLong , Ġunit : ĠTimeUnit ): ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠScheduled Direct Task ( run ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġif Ġ( delay Ġ<= Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . get (). submit ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . get (). schedule ( task , Ġdelay , Ġunit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . set Future ( f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠReject ed ExecutionException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éĶĻè¯¯ å¤ĦçĲĨ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEmpty Disposable . INSTANCE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠScheduled Worker ( private Ġval Ġexecutor : ĠScheduled ExecutorService ) Ġ: ĠWorker () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtasks Ġ= ĠComposite Disposable () ĊĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġvar Ġdisposed : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġschedule ( run : ĠRunnable , Ġdelay : ĠLong , Ġunit : ĠTimeUnit ): ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dis posed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEmpty Disposable . INSTANCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsr Ġ= ĠScheduled Runnable ( run , Ġtasks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . add ( sr ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġif Ġ( delay Ġ<= Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . submit ( sr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . schedule ( sr , Ġdelay , Ġunit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsr . set Future ( f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠReject ed ExecutionException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éĶĻè¯¯ å¤ĦçĲĨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmpty Disposable . INSTANCE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dis posed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisposed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Disposed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdisposed ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }