package Ġu oc . cb on ache . tf g . async Ċ Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Future Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠBor ja Ġon Ġ 3 / 1 / 1 7 . Ċ Ġ*/ Ċ Ċ class ĠAsync Context < T >( val Ġexecution Thread : ĠWeak Reference < T >) Ċ Ċ fun Ġ< T > ĠT . do Async ( ĊĠĠĠĠĠĠĠ Ġexception Handler : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġtask : ĠAsync Context < T >. () Ġ-> ĠUnit Ċ ): ĠFuture < Unit > Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= ĠAsync Context ( Weak Reference ( this )) ĊĠĠĠ Ġreturn ĠBackground Executor . submit Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . task () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( thr : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Handler ?. invoke ( thr ) Ġ?: ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġobject ĠBackground Executor Ġ{ ĊĠĠĠ Ġvar Ġexecutor : ĠExecutor Service Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExec utors . new Scheduled ThreadPool ( 2 Ġ* ĠRuntime . get Runtime (). available Processors ()) ĊĊĠĠĠ Ġfun Ġ< T > Ġsubmit ( task : Ġ() Ġ-> ĠT ): ĠFuture < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexecutor . submit ( task ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ fun Ġ< T > ĠT . do Async ( ĊĠĠĠĠĠĠĠ Ġexception Handler : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ ĠexecutorService : ĠExecutor Service , ĊĠĠĠĠĠĠĠ Ġtask : ĠAsync Context < T >. () Ġ-> ĠUnit Ċ ): ĠFuture < Unit > Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= ĠAsync Context ( Weak Reference ( this )) ĊĠĠĠ Ġreturn ĠexecutorService . submit < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . task () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( thr : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Handler ?. invoke ( thr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠT . onComplete ( ĊĠĠĠĠĠĠĠ ĠexecutorService : ĠPost Execution Thread , ĊĠĠĠĠĠĠĠ Ġexception Handler : Ġ(( Throwable ) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġtask : ĠAsync Context < T >. () Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= ĠAsync Context ( Weak Reference ( this )) ĊĠĠĠ ĠexecutorService . submit Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . task () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( thr : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Handler ?. invoke ( thr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }