рдПрдВрдбреНрд░реЙрдпрдб рдкреГрд╖реНрдарднреВрдорд┐ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ред рднрд╛рдЧ 5: рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдХреЛрд░рд╛рдЯрд╛рдЗрди


рдХреЛрдЯрд▓рд┐рди рджреНрд╡реАрдк

рдЗрд╕ рд╕реАрд░реАрдЬрд╝ рдХреЗ рдкрд┐рдЫрд▓реЗ рдкрд╛рда: рдПрдХреНрд╕реАрдирдЯрд╕реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ , рд▓реЛрдбрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ , рдПрдХреНрд╕рдХреНрдпреВрдЬрд╝рд░реНрд╕ рдФрд░ рдЗрд╡реЗрдВрдЯрдмрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ , рдЖрд░рдПрдХреНрд╕рдЬрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ ред

рддреЛ рдпрд╣ рдШрдВрдЯрд╛ рдЖ рдЧрдпрд╛ред рдпрд╣ рд╡рд╣ рд▓реЗрдЦ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд▓рд┐рдЦреА рдЧрдИ рдереА: рдирдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг "рд╣реБрдб рдХреЗ рддрд╣рдд" рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ред рдпрджрд┐ рдЖрдк рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ:


рдФрд░ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╕рд╛рде рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдиреЗ рдЗрд╕ рдЕрд╡рд╕рд░ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ: рдЖрдк рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХреЙрд░реНрдкрд╕ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдХреЛрд░рдСрдЯрд╛рдЗрди рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд╕реНрдкреЗрдВрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рд╕реНрдкреЗрдВрдб рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:

abstract fun resume(value: T) abstract fun resumeWithException(exception: Throwable) 

рдЯрд╛рдЗрдк рдЯреА рдЖрдкрдХреЗ рдореВрд▓ рд╕рд╕реНрдкреЗрдВрдб рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ: рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдзреИрд░реНрдп, рд╣рдореЗрдВ рдпрд╣ рднреА рдорд┐рд▓рддрд╛ рд╣реИ), рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЙрд╕ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╕реНрдкреЗрдВрдб рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ, рддреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреА рдЬрд╛рддреА рд╣реИред

рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ? рдмреЗрд╢рдХ, Corutin рдмрд┐рд▓реНрдбрд░ рд╕реЗ! рдЖрдЗрдП рдЙрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдХреЛрд░рдЯрд╛рдЗрди рдмрдирд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрдиреНрдЪ:

 public actual fun launch( context: CoroutineContext = DefaultDispatcher, start: CoroutineStart = CoroutineStart.DEFAULT, parent: Job? = null, block: suspend CoroutineScope.() -> Unit ): Job { val newContext = newCoroutineContext(context, parent) val coroutine = if (start.isLazy) LazyStandaloneCoroutine(newContext, block) else StandaloneCoroutine(newContext, active = true) coroutine.start(start, coroutine, block) return coroutine } 

рдпрд╣рд╛рдБ, рдмрд┐рд▓реНрдбрд░ рдПрдХ рдХреЛрд░рдЯрд╛рдЗрди рдмрдирд╛рддрд╛ рд╣реИ - AbstractCoroutine рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдХреЙрдирдЯрд┐рдиреЗрдВрдЯрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╕реНрдЯрд╛рд░реНрдЯ рд╡рд┐рдзрд┐ рдЬреЙрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░рд╛рд░рдВрдн рд╡рд┐рдзрд┐ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЦреЛрдЬрдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рджреВрд╕рд░реА рддрд░рдл рд╕реЗ рдпрд╣рд╛рдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд▓реЙрдиреНрдЪ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ CoroutineContext рд╣реИ, рдФрд░ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ DefaultDispatcher рдкрд░ рд╕реЗрдЯ рд╣реИред рдбрд┐рд╕реНрдкреИрдЪрд░ рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЪрд▓рд┐рдП DefaultDispatcher рдШреЛрд╖рдгрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:

 public actual val DefaultDispatcher: CoroutineDispatcher = CommonPool 

рддреЛ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХреЙрдордирдкреВрд▓ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬрд╛рд╡рд╛ рдбреЙрдХреНрд╕ рд╣рдореЗрдВ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдХреЙрдордирдкреВрд▓ рдХреНрдпрд╛ рд╣реИ?

рдпрд╣ ExkorService рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ ForkJoinPool рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ coroutine рдкреНрд░рдмрдВрдзрдХ рд╣реИред рд╣рд╛рдВ, рдпрд╣ рд╣реИ: рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЗ рд╕рднреА рд▓реИрдореНрдмреНрдбрд╛ рдХреЙрд░рдЯрд╛рдЗрдиреНрд╕ рд╕рд┐рд░реНрдл рд░рдирдиреЗрдмрд▓ рд╣реИрдВ, рдЬреЛ рдЯреНрд░рд┐рдХ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХреНрдЬрд┐рдХреНрдпреВрдЯрд░ рдореЗрдВ рдорд┐рд▓рд╛ред рд▓реЗрдХрд┐рди рд╢реИрддрд╛рди, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╣реИред


рдХрд╛рдВрдЯрд╛? рдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛ?

рдореЗрд░реЗ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ FJP рдХреНрдпрд╛ рд╣реИ: :)


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, ForkJoinPool рдЬрд╛рд╡рд╛ 8 рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЖрдзреБрдирд┐рдХ рдирд┐рд╖реНрдкрд╛рджрдХ рд╣реИред рдореВрд▓ рдХрд╛рд░реНрдп рд╕реНрдЯреНрд░реАрдо рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХреБрд╢рд▓ рд╕рдорд╛рдирддрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рднрд╛рдЧ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрд╛рд░рд╛рдУрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рд╕рдВрдпреЛрдЬрди рдХрд░рдирд╛ рдЬрдм рд╕рднреА рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИрдВ:

 IntStream .range(1, 1_000_000) .parallel() .sum() 

рдРрд╕реА рдзрд╛рд░рд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреА рдЧрдгрдирд╛ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, ForkJoinPool рд░реАрд╕рд░реНрдЪ рдХреЛ рд╢реНрд░реЗрдгреА рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдЧрд╛ (рдкрд╣рд▓реЗ 500,000 рдХреЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ, рдлрд┐рд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ 250,000 рдореЗрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣) рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЗ рдпреЛрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛рдПрдВред рд░рд╛рд╢рд┐ред рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рджреГрд╢реНрдп рд╣реИ:


рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдлрд┐рд░ рд╕реЗ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдПрдлрдЬреЗрдкреА рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ "рдиреМрдХрд░реА рдХреА рдЪреЛрд░реА" рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ: рдЬрдм рдПрдХ рд╡рд┐рд╢реЗрд╖ рдзрд╛рдЧрд╛ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдиреНрдп рдкреВрд▓ рдереНрд░реЗрдбреНрд╕ рдХреА рдХрддрд╛рд░реЛрдВ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪреБрд░рд╛ рд▓реЗрддрд╛ рд╣реИред рдПрдХ рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрд▓реЗрдХреНрд╕реА рд╢рд┐рдкрд┐рд▓реЗрд╡ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рдкреНрд░рд╕реНрддреБрддрд┐ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЦреИрд░, рд╣рдореЗрдВ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рд╣рдорд╛рд░реЗ рдХреЛрд░рдЖрдЙрдЯ рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ! рд▓реЗрдХрд┐рди рд╡реЗ рд╡рд╣рд╛рдБ рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ?

рдпрд╣ рдХреЙрдордирдкреВрд▓ # рдкреНрд░реЗрд╖рдг рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ:

 _pool.execute(timeSource.trackTask(block)) 

рдкреНрд░реЗрд╖рдг рд╡рд┐рдзрд┐ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ (рдореВрд▓реНрдп: рдЯреА) рд╡рд┐рдзрд┐ рд╕реЗ рдкреНрд░реЗрд╖рдг рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ! рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рдХрдВрдЯреАрдиреНрдпреВрдПрд╢рди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдПрдмреНрд╕рдЯреНрд░реИрдХреНрдЯрдЖрдЙрдЯ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ?

рдЪрд╛рд▓ CoroutineDispatcher рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рд╣реИред рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ ContinuationInterceptor рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:

 public actual override fun <T> interceptContinuation(continuation: Continuation<T>): Continuation<T> = DispatchedContinuation(this, continuation) 

рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ? рдЖрдк рдмрд┐рд▓реНрдбрд░ рдХреЙрд░рдЯрд┐рди рдХреЛ рдПрдХ рд╕рд░рд▓ рдмреНрд▓реЙрдХ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдРрд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдХреБрдЫ рднреА рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХреЛрд░рдЯрд╛рдЗрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрд╕ рд╕рдм рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрддреА рд╣реИред рд╡рд╣ рд╣реИ
рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрддреА рд╣реИ, рдбрд┐рд╕реНрдкреИрдЪ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░рддрд╛ рдХреА рдЬрдЧрд╣ рд▓реЗрддреА рд╣реИ, рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЛ рднреЗрдЬрддреА рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред

рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╡рд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рд╡рд┐рдзрд┐ рд╕реЗ рдкреНрд░реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рднрд░реЗрдВред рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╡рд┐рдзрд┐ рдХреЛ рдмреНрд▓реЙрдХ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдСрдЙрдЯрдЖрдЙрдЯ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 public fun <R, T> (suspend R.() -> T).startCoroutine( receiver: R, completion: Continuation<T> ) { createCoroutineUnchecked(receiver, completion).resume(Unit) } 

рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдХреЙрдЙрдЯрд┐рди, рдмрджрд▓реЗ рдореЗрдВ, рдХреЙрд░рдЯреАрдирд╕реНрдЯрд╛рд░реНрдЯ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдореЗрдВ "()" рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдХрд╛ рдмрд┐рд▓реНрдбрд░ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ CoroutineStart.DEFAULT рд╣реИред рд╡рд╣ рд╕рдм рд╣реИ!

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдХреЛрд░реБрдЯрд┐рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ: рдпрд╣ рди рдХреЗрд╡рд▓ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд╣реИред

рдФрд░ рдЬреЛ рд▓реЛрдЧ рдЕрдВрдд рддрдХ рдкрдврд╝ рдЪреБрдХреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдХреНрд▓реВрд╕рд┐рд╡ рдорд┐рд▓рддрд╛ рд╣реИ: рдореЗрд░реА рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдПрдХ рд╡реАрдбрд┐рдпреЛ "рд╡рд╛рдпрд▓рд┐рди рд╡рд╛рджрдХ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ: рд╣рдо рдореЛрдмрд┐рдХреНрд╡рд┐рдХ рдХреЙрдиреНрдлреНрд░реЗрдВрд╕ рд╕реЗ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдХреЙрдЯрд╛рдЙрдЯрд┐рди рдХреЗ рдкрдХреНрд╖ рдореЗрдВ RxJava рдХреЛ рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ"ред рдЖрдирдВрдж рд▓реЗрдВ :)

Source: https://habr.com/ru/post/hi415335/


All Articles