/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġw ca ok aze Ċ Ġ* Ċ Ġ* Ġ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 . w ca ok aze . efficient . coroutines Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . util .* Ċ import Ġkotlin . coroutines .* Ċ Ċ /** Ċ Ġ* Ġ éĢļå¸¸ ãģ® launch ãģ¨ åĲĮ æ§ ĺ ãģ« ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãĤĴ èµ· åĭķ ãģĹãģ¾ãģĻ ãģĮ ãĢģ Ċ Ġ* Ġãģĵãģ® ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģĮ èµ· åĭķ ãģķãĤĮ ãģ¦ ãģĭãĤī å®Ł éļ Ľ ãģ« åĩ¦çĲĨ ãģĮ å§ĭ ãģ¾ ãĤĭ ãģ¾ãģ§ ãģ® éĸĵ ãģ« ãĢģ Ċ Ġ* Ġ åĲĮ ãģĺ taskId ãģ® ä»ĸ ãģ® ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģ® åĩ¦çĲĨ ãģĮ ãģĻ ãģ§ ãģ« å§ĭ ãģ¾ ãģ£ãģ¦ ãģĹãģ¾ ãģ£ ãģ¦ãģĦ ãģŁ åł´åĲĪ ãĢģ Ċ Ġ* Ġãģĵãģ® ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģ® åĩ¦çĲĨ ãģ¯ è¡Į ãĤı ãģļ ãĢģ åħĪ ãģ« å§ĭ ãģ¾ ãģ£ ãģ¦ãģĦ ãģŁ ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģ« Ċ Ġ* Ġ[ join ][ Job . join ] ãģĹãģ¾ãģĻ ãĢĤ Ċ Ġ* Ċ Ġ* Ġ åħ¸ åŀĭ çļĦ ãģ«ãģ¯ GET ç³» ãģ® ãĥį ãĥĥãĥĪ ãĥ¯ãĥ¼ãĤ¯ åĩ¦çĲĨ ãģ® éĩį è¤ĩ ãĤĴ éģ¿ ãģĳãĤĭ ãģŁãĤģ ãģ« ä½¿ ãģĦ ãģ¾ãģĻ ãģĮ ãĢģ taskId ãģ¨ãģĹãģ¦ Ċ Ġ* Ġ[ java . net . URL ] ãģ¯ ä½¿ ãĤı ãģªãģĦ ãĤĪãģĨãģ« æ³¨æĦı ãģĹãģ¦ãģıãģłãģķãģĦ ãĢĤ Ċ Ġ* Ġ[ java . net . URL ãģ® equals ]( https :// docs . oracle . com / javase / jp / 8 / docs / api / java / net / URL . html # equals - java . lang . Object -) Ċ Ġ* Ġãģ¯ ãĢģ IP ãĤ¢ ãĥī ãĥ¬ ãĤ¹ ãģ® è§£ æ±º ãĤĴè¡Į ãģĨ ãģŁãĤģ ãĢģ ãģ¨ ãĤĵ ãģ§ ãĤĤ ãģªãģı éģ ħ ãģĦ ãģ§ãģĻ ãĢĤ Ċ Ġ* Ċ Ġ* Ġ## ĠãĤ ¿ ãĤ¤ ãĥŁ ãĥ³ãĤ° è©³ç´° Ċ Ġ* Ġlaunch åĳ¼ ãģ³ åĩº ãģĹ ãģ® ãĤ¿ãĤ¤ ãĥŁ ãĥ³ãĤ° ãĤĴ Ġ* L * Ġ ãĢģ Ċ Ġ* Ġ å®Ł éļ Ľ ãģ« ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģ® å®Łè¡Į ãģĮ éĸĭå§ĭ ãģķãĤĮãĤĭ ( âī Ĵ æľĢ åĪĿ ãģ® dispatch ) ãĤ¿ãĤ¤ ãĥŁ ãĥ³ãĤ° ãĤĴ Ġ* D * Ġ ãĢģ Ċ Ġ* Ġ åĩ¦çĲĨ ãģĮ çµĤ ãĤı ãĤĭ ãĤ¿ãĤ¤ ãĥŁ ãĥ³ãĤ° ãĤĴ Ġ* F * Ġãģ¨ ãģĻãĤĭãģ¨ Ċ Ġ* Ċ Ġ* Ġ### Ġ åĩ¦çĲĨ ãģĮ çľģ çķ¥ ãģķãĤĮãĤĭ ãĥĳ ãĤ¿ ãĥ¼ãĥ³ Ċ Ġ* ĠL ãĢ ľ D ãģ® éĸĵ ãģ« ä»ĸ ãģ® ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģ® D ãĢ ľ F ãģĮ å®Łè¡Į ãģķãĤĮãģŁ åł´åĲĪ ãģ§ãģĻ ãĢĤ Ċ Ġ* Ġ``` Ċ Ġ* ĠL --------- D ------ F Ċ Ġ* ĠĠĠ ĠL -- D ========== F Ċ Ġ* Ġ``` Ċ Ġ* Ġ``` Ċ Ġ* ĠL --------------- DF Ċ Ġ* ĠĠĠ ĠL -- D ====== F Ċ Ġ* Ġ``` Ċ Ġ* Ġ``` Ċ Ġ* ĠĠĠĠĠ ĠL ------- D ------ F Ċ Ġ* ĠL -------- D ========== F Ċ Ġ* Ġ``` Ċ Ġ* Ġ``` Ċ Ġ* ĠĠĠ ĠL --------- DF Ċ Ġ* ĠL ---- D ===== F Ċ Ġ* Ġ``` Ċ Ġ* Ġ``` Ċ Ġ* ĠĠĠĠĠ ĠL ------- D --- F Ċ Ġ* ĠL -- D ============= F Ċ Ġ* Ġ``` Ċ Ġ* Ġ``` Ċ Ġ* ĠĠĠĠĠ ĠL ------- DF Ċ Ġ* ĠL -- D ===== F Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ### Ġ éĢļå¸¸ éĢļ ãĤĬ åĩ¦çĲĨ ãģķãĤĮãĤĭ ãĥĳ ãĤ¿ ãĥ¼ãĥ³ Ċ Ġ* Ġ åĲĮ ãģĺ taskId ãģ® ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģĮ ä»ĸ ãģ« åŃĺåľ¨ ãģĹãģªãģĦ åł´åĲĪ ãģĭ ãĢģ Ċ Ġ* Ġ ä»ĸ ãģ® ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģ® D ãĤĪ ãĤĬ åħĪ ãģ« ãģĵ ãģ¡ ãĤī ãģ® D ãģĮ çĻº çĶŁ ãģĹãģŁ åł´åĲĪ ãģĭ ãĢģ Ċ Ġ* Ġ ãģĵ ãģ¡ ãĤī ãģ® L ãģ® æĻĤ çĤ¹ ãģ§ãģĻ ãģ§ ãģ« ä»ĸ ãģ® ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģ® F ãģĮ çµĤ ãĤı ãģ£ ãģ¦ãģĦãĤĭ åł´åĲĪ ãģ§ãģĻ ãĢĤ Ċ Ġ* Ġ``` Ċ Ġ* ĠL -------- D ========== F Ċ Ġ* ĠĠĠĠĠ ĠL ------- D ------ F Ċ Ġ* Ġ``` Ċ Ġ* Ġ``` Ċ Ġ* ĠĠĠ ĠL -- D ========== F Ċ Ġ* ĠL --------- D ------ F Ċ Ġ* Ġ``` Ċ Ġ* Ġ``` Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ ĠL -- D ==== F Ċ Ġ* ĠL -- D ==== F Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun ĠCor outine Scope . launch ( ĊĠĠĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠĠĠ Ġstart : ĠCor outine Start Ġ= ĠCor outine Start . DEFAULT , ĊĠĠĠĠĠ Ġtask Map : ĠTask Map Ġ= Ġglobal Task Map , ĊĠĠĠĠĠ ĠtaskId : ĠAny , ĊĠĠĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit Ċ ): ĠJob Ġ{ ĊĠĠ Ġlateinit Ġvar Ġjob : ĠJob ĊĊĠĠ Ġval Ġlaunched Time Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠ Ġjob Ġ= Ġlaunch ( context , Ġstart ) Ġ{ ĊĠĠĠĠĠ Ġval Ġactive Task Ġ= Ġtask Map . on Task Active ( taskId , Ġjob , Ġlaunched Time ) ĊĊĠĠĠĠĠ Ġif Ġ( active Task Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġactive Task . join () ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtask Map . on Task Finished ( taskId , Ġjob ) ĊĠĠ Ġ} ĊĊĠĠ Ġtask Map . add Scheduled Job ( taskId , Ġjob ) ĊĊĠĠ Ġreturn Ġjob Ċ } Ċ Ċ /** Ċ Ġ* Ġ éĢļå¸¸ ãģ® async ãģ¨ åĲĮ æ§ ĺ ãģ« ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãĤĴ èµ· åĭķ ãģĹãģ¾ãģĻ ãģĮ ãĢģ Ċ Ġ* Ġãģĵãģ® ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģĮ èµ· åĭķ ãģķãĤĮ ãģ¦ ãģĭãĤī å®Ł éļ Ľ ãģ« åĩ¦çĲĨ ãģĮ å§ĭ ãģ¾ ãĤĭ ãģ¾ãģ§ ãģ® éĸĵ ãģ« ãĢģ Ċ Ġ* Ġ åĲĮ ãģĺ taskId ãģ® ä»ĸ ãģ® ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģ® åĩ¦çĲĨ ãģĮ ãģĻ ãģ§ ãģ« å§ĭ ãģ¾ ãģ£ãģ¦ ãģĹãģ¾ ãģ£ ãģ¦ãģĦ ãģŁ åł´åĲĪ ãĢģ Ċ Ġ* Ġãģĵãģ® ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãģ® åĩ¦çĲĨ ãģ¯ è¡Į ãĤı ãģļ ãĢģ åħĪ ãģ« å§ĭ ãģ¾ ãģ£ ãģ¦ãģĦ ãģŁ ãĤ³ ãĥ« ãĥ¼ãĥ ģ ãĥ³ ãĤĴ Ċ Ġ* Ġ[ await ][ Deferred . await ] ãģĹãģ¾ãģĻ ãĢĤ Ċ Ġ* Ċ Ġ* Ġ åħ¸ åŀĭ çļĦ ãģ«ãģ¯ GET ç³» ãģ® ãĥį ãĥĥãĥĪ ãĥ¯ãĥ¼ãĤ¯ åĩ¦çĲĨ ãģ® éĩį è¤ĩ ãĤĴ éģ¿ ãģĳãĤĭ ãģŁãĤģ ãģ« ä½¿ ãģĦ ãģ¾ãģĻ ãģĮ ãĢģ taskId ãģ¨ãģĹãģ¦ Ċ Ġ* Ġ[ java . net . URL ] ãģ¯ ä½¿ ãĤı ãģªãģĦ ãĤĪãģĨãģ« æ³¨æĦı ãģĹãģ¦ãģıãģłãģķãģĦ ãĢĤ Ċ Ġ* Ġ[ java . net . URL ãģ® equals ]( https :// docs . oracle . com / javase / jp / 8 / docs / api / java / net / URL . html # equals - java . lang . Object -) Ċ Ġ* Ġãģ¯ ãĢģ IP ãĤ¢ ãĥī ãĥ¬ ãĤ¹ ãģ® è§£ æ±º ãĤĴè¡Į ãģĨ ãģŁãĤģ ãĢģ ãģ¨ ãĤĵ ãģ§ ãĤĤ ãģªãģı éģ ħ ãģĦ ãģ§ãģĻ ãĢĤ Ċ Ġ* Ċ Ġ* Ġ ãģ¾ãģŁ ãĢģ åħ¨ ãģı éģ ķ ãģĨ åĩ¦çĲĨ ãģ« åģ ¶ çĦ¶ åĲĮ ãģĺ taskId ãĤĴ åī² ãĤĬ æĮ ¯ ãĤĭ ãģĵãģ¨ ãģ«ãĤĪ ãģ£ãģ¦ Ċ Ġ* ĠClass CastException ãģĮ çĻº çĶŁ ãģĹ å¾Ĺ ãĤĭ ãģĵãģ¨ ãģ« ãĤĤ æ³¨æĦı ãģĹãģ¦ãģıãģłãģķãģĦ ãĢĤ Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġval Ġdeferred Int ĠĠĠ Ġ= Ġasync ( taskId Ġ= Ġ 0 ) Ġ{ Ġfetch Int () Ġ} Ċ Ġ* Ġval Ġdeferred String Ġ= Ġasync ( taskId Ġ= Ġ 0 ) Ġ{ Ġfetch String () Ġ} Ċ Ġ* Ċ Ġ* Ġval Ġstring Ġ= Ġdeferred String . await () Ġ// ĠClass CastException Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun Ġ< T > ĠCor outine Scope . async ( ĊĠĠĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠĠĠ Ġstart : ĠCor outine Start Ġ= ĠCor outine Start . DEFAULT , ĊĠĠĠĠĠ Ġtask Map : ĠTask Map Ġ= Ġglobal Task Map , ĊĠĠĠĠĠ ĠtaskId : ĠAny , ĊĠĠĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT Ċ ): ĠDeferred < T > Ġ{ ĊĠĠ Ġlateinit Ġvar Ġdeferred : ĠDeferred < T > ĊĊĠĠ Ġval Ġlaunched Time Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠ Ġdeferred Ġ= Ġasync ( context , Ġstart ) Ġ{ ĊĠĠĠĠĠ Ġval Ġactive Task Ġ= Ġtask Map . on Task Active ( taskId , Ġdeferred , Ġlaunched Time ) ĊĊĠĠĠĠĠ Ġval Ġr Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠ Ġactive Task Ġis ĠDeferred < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive Task . await () Ġas ĠT ĊĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠ Ġactive Task Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive Task . join () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnit Ġas ĠT ĊĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtask Map . on Task Finished ( taskId , Ġdeferred ) ĊĊĠĠĠĠĠ Ġr ĊĠĠ Ġ} ĊĊĠĠ Ġtask Map . add Scheduled Job ( taskId , Ġdeferred ) ĊĊĠĠ Ġreturn Ġdeferred Ċ } Ċ Ċ val Ġglobal Task Map Ġ= ĠTask Map () Ċ Ċ /** Ċ Ġ* ĠtaskId ãĤĴ ç®¡çĲĨ ãģĻãĤĭ ãĤ¤ãĥ³ ãĤ¹ãĤ¿ ãĥ³ãĤ¹ ãģ§ãģĻ ãĢĤ æ¦Ĥå¿µ çļĦ ãģ«ãģ¯ Ġ` Map < Any , ĠJob >` Ġãģ« è¿ĳ ãģĦ ãģ§ãģĻ ãĢĤ Ċ Ġ*/ Ċ class ĠTask Map Ġ{ ĊĠĠ Ġprivate Ġval Ġtasks Ġ= ĠHashMap < Any , ĠTask >() ĊĊĠĠ Ġ@ Synchron ized ĊĠĠ Ġinternal Ġfun Ġadd Scheduled Job ( taskId : ĠAny , Ġjob : ĠJob ) Ġ{ ĊĠĠĠĠĠ Ġvar Ġtask Ġ= Ġtasks [ taskId ] ĊĊĠĠĠĠĠ Ġif Ġ( task Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġtask Ġ= ĠTask ( Task . State . Scheduled ( System . currentTimeMillis ())) ĊĠĠĠĠĠĠĠĠ Ġtasks [ taskId ] Ġ= Ġtask ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtask . jobs Ġ+= Ġjob ĊĠĠ Ġ} ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* Ġ@ return Ġ ãģĻ ãģ§ ãģ« Active ãģª ãĤ¿ ãĤ¹ãĤ¯ ãģĮ åŃĺåľ¨ ãģĻãĤĭ åł´åĲĪ ãģĿãģ® Job ĊĠĠĠ Ġ*/ ĊĠĠ Ġ@ Synchron ized ĊĠĠ Ġinternal Ġfun Ġon Task Active ( taskId : ĠAny , Ġjob : ĠJob , Ġlaunched Time : ĠLong ): ĠJob ? Ġ{ ĊĠĠĠĠĠ Ġval Ġtask Ġ= Ġtasks [ taskId ] Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġval Ġstate Ġ= Ġtask . state ĊĊĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠ Ġstate Ġis ĠTask . State . Active ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġstate . job ĊĊĠĠĠĠĠĠĠĠ Ġstate Ġis ĠTask . State . Finished Ġ&& Ġtask . state . time Ġ> Ġlaunched Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġstate . job ĊĊĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . state Ġ= ĠTask . State . Active ( System . currentTimeMillis (), Ġjob ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġ@ Synchron ized ĊĠĠ Ġinternal Ġfun Ġon Task Finished ( taskId : ĠAny , Ġjob : ĠJob ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtask Ġ= Ġtasks [ taskId ] Ġ?: Ġreturn ĊĊĠĠĠĠĠ Ġtask . jobs Ġ-= Ġjob ĊĊĠĠĠĠĠ Ġif Ġ( task . jobs . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġtasks Ġ-= ĠtaskId ĊĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ(( task . state Ġas ? ĠTask . State . Active )?. job Ġ== Ġjob ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġtask . state Ġ= ĠTask . State . Finished ( System . currentTimeMillis (), Ġjob ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠTask ( var Ġstate : ĠState ) Ġ{ ĊĠĠ Ġval Ġjobs : ĠMutable List < Job > Ġ= ĠLinkedList () ĊĊĠĠ Ġsealed Ġclass ĠState ( val Ġtime : ĠLong ) Ġ{ ĊĠĠĠĠĠ Ġ/** Ġlaunch ãģķãĤĮãģŁ ãģĮ ãģ¾ ãģł å®Łè¡Į ãģķãĤĮ ãģ¦ãģĦ ãģªãģĦ Ġ*/ ĊĠĠĠĠĠ Ġclass ĠScheduled ( time : ĠLong ) Ġ: ĠState ( time ) ĊĊĠĠĠĠĠ Ġ/** Ġ å®Łè¡Į ä¸Ń ãĢĤ suspend ãĥĿ ãĤ¤ãĥ³ ãĥĪ ãģ§ å¾ħ æ©Ł ä¸Ń ãģ® çĬ¶æħĭ ãĤĤ åĲ« ãĤĢ Ġ*/ ĊĠĠĠĠĠ Ġclass ĠActive ( time : ĠLong , Ġval Ġjob : ĠJob ) Ġ: ĠState ( time ) ĊĊĠĠĠĠĠ Ġ/** Ġ å®Į äºĨ æ¸ Ī ãģ¿ Ġ*/ ĊĠĠĠĠĠ Ġclass ĠFinished ( time : ĠLong , Ġval Ġjob : ĠJob ) Ġ: ĠState ( time ) ĊĠĠ Ġ} Ċ } Ċ