package Ġcom . easy . kotlin Ċ Ċ import Ġkotlinx . coroutines . experimental .* Ċ import Ġkotlin . system . measure Time Millis Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġj ack Ġon Ġ 2 0 1 7 / 7 / 1 3 . Ċ Ġ*/ Ċ class ĠComp osing Sus pending Functions Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġdo Job 1 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Do ing ĠJob 1 Ġ... ") ĊĠĠĠĠĠĠĠ Ġdelay ( 3 0 0 0 L ) Ġ// ĠæŃ¤ å¤Ħ æ¨¡ æĭŁ æĪĳä»¬çļĦ å·¥ä½ľ ä»£çłģ ĊĠĠĠĠĠĠĠ Ġprintln (" Job 1 ĠDone ") ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġdo Job 2 (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Do ing ĠJob 2 Ġ... ") ĊĠĠĠĠĠĠĠ Ġdelay ( 3 0 0 0 L ) Ġ// ĠæŃ¤ å¤Ħ æ¨¡ æĭŁ æĪĳä»¬çļĦ å·¥ä½ľ ä»£çłģ ĊĠĠĠĠĠĠĠ Ġprintln (" Job 2 ĠDone ") ĊĠĠĠĠĠĠĠ Ġreturn Ġ 2 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Sequential () Ġ= Ġrun Blocking < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġone Ġ= Ġdo Job 1 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtwo Ġ= Ġdo Job 2 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ test Sequential ] Ġ æľĢç»Ī ç»ĵæŀľ ï¼ļ Ġ${ one Ġ+ Ġtwo }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln ("[ test Sequential ] ĠCompleted Ġin Ġ$ time Ġms ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Async () Ġ= Ġrun Blocking < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġone Ġ= Ġasync ( Common Pool ) Ġ{ Ġdo Job 1 () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtwo Ġ= Ġasync ( Common Pool ) Ġ{ Ġdo Job 2 () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ test Async ] Ġ æľĢç»Ī ç»ĵæŀľ ï¼ļ Ġ${ one . await () Ġ+ Ġtwo . await () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln ("[ test Async ] ĠCompleted Ġin Ġ$ time Ġms ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtest Dispatch ers And Threads () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjobs Ġ= Ġarray ListOf < Job >() ĊĠĠĠĠĠĠĠ Ġjobs Ġ+= Ġlaunch ( Un conf ined ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æľª ä½ľ éĻĲåĪ¶ Ġ-- Ġå°Ĩ ä¼ļ åľ¨ Ġmain Ġthread Ġä¸Ń æī§è¡Į ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Un conf ined : ĠI 'm Ġworking Ġin Ġthread Ġ${ Thread . currentThread () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġjobs Ġ+= Ġlaunch ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ çĪ¶ åįı ç¨ĭ çļĦ ä¸Ĭä¸ĭ æĸĩ Ġ ï¼ļ Ġrun Blocking Ġcoroutine ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" context : ĠI 'm Ġworking Ġin Ġthread Ġ${ Thread . currentThread () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġjobs Ġ+= Ġlaunch ( Common Pool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ è°ĥ åº¦ æĮĩ æ´¾ ç»Ļ ĠFork Join Pool . common Pool ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Common Pool : ĠI 'm Ġworking Ġin Ġthread Ġ${ Thread . currentThread () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġjobs Ġ+= Ġlaunch ( new Single Thread Context (" My Own Thread ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå°Ĩ ä¼ļ åľ¨ è¿Ļä¸ª åįı ç¨ĭ èĩªå·±çļĦ æĸ° çº¿ç¨ĭ ä¸Ń æī§è¡Į ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" new Single Thread Context : ĠI 'm Ġworking Ġin Ġthread Ġ${ Thread . currentThread () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġjobs . forEach Ġ{ Ġit . join () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlog ( msg : ĠString ) Ġ= Ġprintln ("${ Thread . currentThread ()} Ġ$ msg ") ĊĊĠĠĠ Ġfun Ġtest Run Blocking With Specified Context () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġlog ("$ context ") ĊĠĠĠĠĠĠĠ Ġlog ("${ context [ Job ]} ") ĊĠĠĠĠĠĠĠ Ġlog (" å¼Ģå§ĭ ") ĊĊĠĠĠĠĠĠĠ Ġval Ġctx 1 Ġ= Ġnew Single Thread Context (" çº¿ç¨ĭ A ") ĊĠĠĠĠĠĠĠ Ġval Ġctx 2 Ġ= Ġnew Single Thread Context (" çº¿ç¨ĭ B ") ĊĠĠĠĠĠĠĠ Ġrun Blocking ( ctx 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" Started Ġin ĠContext 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( ctx 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" Working Ġin ĠContext 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" Back Ġto ĠContext 1 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog (" ç»ĵæĿŁ ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġtest Children Coroutine () = Ġrun Blocking < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġlaunch ( Common Pool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" Context A 1 : Ġ${ context }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob 1 Ġ= Ġlaunch ( Common Pool ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" job 1 : Ġ çĭ¬ç«ĭ çļĦ åįı ç¨ĭ ä¸Ĭä¸ĭ æĸĩ !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" job 1 : Ġ ä¸įä¼ļ åıĹ åĪ° request . cancel () çļĦ å½±åĵį ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ç»§æī¿ çĪ¶ ä¸Ĭä¸ĭ æĸĩ ï¼ļ request çļĦ context ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob 2 Ġ= Ġlaunch ( context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" Context A 2 : Ġ${ context }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" job 2 : Ġæĺ¯ request Ġcoroutine çļĦ åŃĲ åįı ç¨ĭ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" job 2 : Ġå½ĵ request . cancel () ï¼Į job 2 ä¹Ł ä¼ļ è¢« åıĸæ¶Ī ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob 1 . join () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob 2 . join () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġrequest . cancel () ĊĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġprintln (" main : ĠWho Ġhas Ġsurv ived Ġrequest Ġcancellation ?") ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġc sf Ġ= ĠComp osing Sus pending Functions () Ċ // ĠĠĠ Ġc sf . test Sequential () Ċ // ĠĠĠ Ġc sf . test Async () Ċ // ĠĠĠ Ġc sf . test Dispatch ers And Threads () Ċ // ĠĠĠ Ġc sf . test Run Blocking With Specified Context () ĊĠĠĠ Ġc sf . test Children Coroutine () Ċ } Ċ