package Ġio . github . fast _ startup . dispatcher Ċ Ċ import Ġio . github . fast _ startup . I Startup Ċ import Ġio . github . fast _ startup . config . Startup Config Ċ import Ġio . github . fast _ startup . executor . Executor Manager Ċ import Ġio . github . fast _ startup . extensions . get Unique Key Ċ import Ġio . github . fast _ startup . listener . All Startup Complete Listener Ċ import Ġio . github . fast _ startup . listener . Startup Complete Listener Ċ import Ġio . github . fast _ startup . listener . UI Startup Complete Listener Ċ import Ġio . github . fast _ startup . module . Startup Info Store Ċ import Ġio . github . fast _ startup . module . Startup Sort Store Ċ import Ġio . github . fast _ startup . run . Startup Runnable Ċ import Ġio . github . fast _ startup . utils . Startup Cost Times Util Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ /** Ċ Ġ* ĠAuthor : Ġx u wei yu Ċ Ġ* ĠDate : Ġ 2 0 2 1 / 1 2 / 3 Ċ Ġ* ĠEmail : Ġw izz . xu @ outlook . com Ċ Ġ* ĠDescription : Ċ Ġ*/ Ċ internal Ġclass ĠDefault Dispatcher ( ĊĠĠĠ Ġprivate Ġval Ġstartup Config : ĠStartup Config ?, ĊĠĠĠ Ġprivate Ġval Ġstartup Info Store : ĠStartup Info Store Ċ ) Ġ: ĠI Dispatcher Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstartup Sort Store : ĠStartup Sort Store ĊĊĠĠĠ Ġ// Ġ å·¥ä½ľ åľ¨ ui çº¿ç¨ĭ çļĦ startup çļĦ æķ°éĩı ĊĠĠĠ Ġprivate Ġval Ġui Thread Task Size Ġ= ĠAtomicInteger () ĊĊĠĠĠ Ġ// Ġ æīĢæľī startup çļĦ æķ°éĩı ĊĠĠĠ Ġprivate Ġval Ġall Task Size Ġ= ĠAtomicInteger () ĊĊĠĠĠ Ġ// ĠéľĢè¦ģ ui çº¿ç¨ĭ çŃīå¾ħ çļĦ startup çļĦ æķ°éĩı ĊĠĠĠ Ġprivate Ġval Ġneed UIT hread Wait Task Size Ġ= ĠAtomicInteger () ĊĊĠĠĠ Ġ// Ġui çº¿ç¨ĭ startup æī§è¡Į å®Į æ¯ķ çļĦ åĽŀè°ĥ ĊĠĠĠ Ġvar Ġui Startup Complete Listener : ĠUI Startup Complete Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġ// Ġ æīĢæľīçļĦ startup æī§è¡Į å®Į æ¯ķ çļĦ åĽŀè°ĥ ĊĠĠĠ Ġvar Ġall Startup Complete Listener : ĠAll Startup Complete Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġ// Ġæ¯ı ä¸Ģä¸ª startup æī§è¡Į å®Į æ¯ķ çļĦ åĽŀè°ĥ ĊĠĠĠ Ġvar Ġstartup Complete Listener : ĠStartup Complete Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġcount DownLatch : ĠCount DownLatch ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġstartup Cost Times Utils : ĠStartup Cost Times Util ? Ġ= Ġnull ĊĊĊĠĠĠ Ġfun Ġstart ( startup Sort Store : ĠStartup Sort Store , Ġstartup Cost Times Utils : ĠStartup Cost Times Util ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . startup Cost Times Utils Ġ= Ġstartup Cost Times Utils ĊĊĠĠĠĠĠĠĠ Ġui Thread Task Size . add AndGet ( startup Sort Store . ui Thread Task Size ) ĊĠĠĠĠĠĠĠ Ġall Task Size . add AndGet ( startup Sort Store . all Task Size ) ĊĠĠĠĠĠĠĠ Ġneed UIT hread Wait Task Size . add AndGet ( startup Sort Store . need UIT hread Wait Task Size ) ĊĠĠĠĠĠĠĠ Ġthis . startup Sort Store Ġ= Ġstartup Sort Store ĊĊĠĠĠĠĠĠĠ Ġdispatch On IO () ĊĠĠĠĠĠĠĠ Ġdispatch On Main () ĊĠĠĠĠĠĠĠ Ġui Startup Complete Listener ?. startup Complete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdispatch On IO () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstartup Ġ= Ġstartup Sort Store . io Zero Deque . remove First OrNull () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( startup Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExecutor Manager . instance . execute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStartup Runnable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstartup , Ġstartup Config , Ġstartup Sort Store , Ġstartup Info Store , Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstartup Cost Times Utils ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstartup Ġ= Ġstartup Sort Store . io Zero Deque . remove First OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdispatch On Main () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstartup : ĠI Startup < *> ? Ġ= Ġstartup Sort Store . ui Zero Deque . remove First OrNull () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( ui Thread Task Size . get () Ġ> Ġ 0 Ġ|| Ġneed UIT hread Wait Task Size . get () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( startup Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStartup Runnable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstartup , Ġstartup Config , Ġstartup Sort Store , Ġstartup Info Store , Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstartup Cost Times Utils ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount DownLatch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount DownLatch ?. await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount DownLatch Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstartup Ġ= Ġstartup Sort Store . ui Zero Deque . remove First OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . startup Cost Times Utils ?. record UIT hread Start ups End () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġdispatch ( complete Startup : ĠI Startup <* >, Ġstartup Sort Store : ĠStartup Sort Store ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġunique Key Ġ= Ġcomplete Startup . java Class . get Unique Key () ĊĠĠĠĠĠĠĠ Ġval Ġits Ġ= Ġstartup Sort Store . startup Children Map . iterator () ĊĠĠĠĠĠĠĠ Ġif Ġ( complete Startup . run On UIT hread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Thread Task Size . decrement AndGet () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstartup Complete Listener ?. startup Complete ( complete Startup ) ĊĠĠĠĠĠĠĠ Ġ// Ġ ç§»éĻ¤ æīĢæľī éľĢè¦ģ ä¾Ŀèµĸ è¯¥ startup çļĦ Ġ ä¾Ŀèµĸ åħ³èģĶ ĊĠĠĠĠĠĠĠ Ġstartup Info Store . all Startup Dependencies List . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove ( unique Key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( its . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġits . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . value . remove ( unique Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . value . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġits . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstartup Info Store . startup Map [ entry . key ]?. let Ġ{ Ġstartup Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( startup . run On UIT hread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstartup Sort Store . ui Zero Deque . add ( startup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstartup Sort Store . io Zero Deque . add ( startup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ UI çº¿ç¨ĭ éĺŁåĪĹ æľī ä»»åĬ¡ ï¼Į åĶ ¤ é ĨĴ UI çº¿ç¨ĭ ĊĠĠĠĠĠĠĠ Ġif Ġ( startup Sort Store . ui Zero Deque . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount DownLatch ?. count Down () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . startup Cost Times Utils ?. record UIT hread Start ups End () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( complete Startup . need UIT hread Wait ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( need UIT hread Wait Task Size . decrement AndGet () Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . startup Cost Times Utils ?. record UIT hread Start ups End () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount DownLatch ?. count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( all Task Size . decrement AndGet () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch On IO () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstartup Cost Times Utils ?. record All Start ups End () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Startup Complete Listener ?. startup Complete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstartup Cost Times Utils ?. print All () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }