如何启动kotlin协程(代码片段)

且听真言 且听真言     2022-11-24     637

关键词:

启动协程的基本方式

1.GlobalScope.launch

代码示例:

fun testGlobalScope() 
    GlobalScope.launch 
        println("Coroutinue started!")
        delay(1000L)
        println("Hello World!")
    
    println("After launch!")
    Thread.sleep(2000L)
    println("Process end!")



/**
 * After launch!
 * Coroutinue started!
 * Hello World!
 * Process end!
 */
@DelicateCoroutinesApi
public object GlobalScope : CoroutineScope 
    /**
     * Returns [EmptyCoroutineContext].
     */
    override val coroutineContext: CoroutineContext
        get() = EmptyCoroutineContext
public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job 
    val newContext = newCoroutineContext(context)
    val coroutine = if (start.isLazy)
        LazyStandaloneCoroutine(newContext, block) else
        StandaloneCoroutine(newContext, active = true)
    coroutine.start(start, coroutine, block)
    return coroutine

launch函数是CoroutineScope的扩展函数,它有三个参数:

  1.  context: CoroutineContext = EmptyCoroutineContext, 第一个参数是协程上下文,它的默认值是 EmptyCoroutineContext,如果不传这个参数,默认就会使用 EmptyCoroutineContext。也可以传入 Kotlin 官方为我们提供的 Dispatchers,来指定协程运行的线程池。(Dispatchers.IO、Dispatchers.Unconfined、Dispatchers.Main)
  2. start: CoroutineStart = CoroutineStart.DEFAULT,第二个参数是协程的启动模式,默认值是CoroutineStart.DEFAULT,CoroutineStart 是一个枚举类,一共有:DEFAULT、LAZY、ATOMIC、UNDISPATCHED。
  3. block: suspend CoroutineScope.() -> Unit,第三个参数是函数类型block,它的类型是suspend CoroutineScope.() -> Unit。本质是一个挂起函数。
  4. 函数的返回值是一个 Job,它其实代表的是协程的句柄,并不能返回协程的执行结果。

2.runBlocking 启动协程

代码示例

fun testRunBlocking2() 
    runBlocking 
        println("Coroutinue started!")
        delay(1000L)
        println("Hello World!")
    
    println("After Launch")
    Thread.sleep(2000L)
    println("Process end")




/**
 * Coroutinue started!
 * Hello World!
 * After Launch
 * Process end
 */
@Throws(InterruptedException::class)
public actual fun <T> runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T 
    contract 
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    
    val currentThread = Thread.currentThread()
    val contextInterceptor = context[ContinuationInterceptor]
    val eventLoop: EventLoop?
    val newContext: CoroutineContext
    if (contextInterceptor == null) 
        // create or use private event loop if no dispatcher is specified
        eventLoop = ThreadLocalEventLoop.eventLoop
        newContext = GlobalScope.newCoroutineContext(context + eventLoop)
     else 
        // See if context's interceptor is an event loop that we shall use (to support TestContext)
        // or take an existing thread-local event loop if present to avoid blocking it (but don't create one)
        eventLoop = (contextInterceptor as? EventLoop)?.takeIf  it.shouldBeProcessedFromContext() 
            ?: ThreadLocalEventLoop.currentOrNull()
        newContext = GlobalScope.newCoroutineContext(context)
    
    val coroutine = BlockingCoroutine<T>(newContext, currentThread, eventLoop)
    coroutine.start(CoroutineStart.DEFAULT, coroutine, block)
    return coroutine.joinBlocking()

runBlocking是普通函数,第一个参数:context: CoroutineContext,协程上下文。第二个参数是函数类型,block: suspend CoroutineScope.() -> T,函数类型是有返回值类型 T 的,与 runBlocking 的返回值类型是一样的,runBlocking 其实是可以从协程当中返回执行结果的。

fun testRunBlocking() 
    val runBlockingResult = runBlocking 
        delay(500L)
        return@runBlocking "HaHa"
    
    println("result:$runBlockingResult")


result:HaHa

runBlocking特点:

  1. runBlocking 启动的协程会阻塞当前线程的执行。

3.async 启动协程

使用 async 创建协程,可以通过它返回的Deferred拿到协程的执行结果。

代码示例

fun testAsync() 
    runBlocking 
        val deferred = async 
            println("do async:$Thread.currentThread().name")
            delay(1000L)
            return@async "do completed"
        
        println("After async:$Thread.currentThread().name")
        val result = deferred.await()
        println("Result is: $result")
    


After async:main @coroutine#1
do async:main @coroutine#2
Result is: do completed
public fun <T> CoroutineScope.async(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> T
): Deferred<T> 
    val newContext = newCoroutineContext(context)
    val coroutine = if (start.isLazy)
        LazyDeferredCoroutine(newContext, block) else
        DeferredCoroutine<T>(newContext, active = true)
    coroutine.start(start, coroutine, block)
    return coroutine

async注意点

  1.  async 启动协程以后,不会阻塞当前程序的执行流程。
  2.  async的返回值,是一个 Deferred 对象,它的 await() 方法,就可以拿到协程的执行结果。
  3. await只是等待执行完,并不是触发执行。

kotlin协程(代码片段)

一、CoroutineScope协程作用域,通过socpe启动一个或者多个协程,同一个socpe启动都算他的子协程GlobalScope//全局协程,生命周期与app相同MainScope()//在主线程启动协程viewmodelScope//生命周期与viewmodel绑定的协程privatevalmainScop... 查看详情

kotlin协程万字协程一篇完成kotlin协程进阶(代码片段)

kotlin协程进阶协程简介一、协程的基本使用1.1、runBlocking启动1.2、GlobalScope.launch启动1.3、GlobalScope.async启动1.4、三种启动方式的说明二、Coroutine源码解析2.1、CoroutineContext2.2、Job源码2.3、Job的常用函数2.4、SupervisorJob三、suspend关键... 查看详情

kotlin协程-launch原理笔记(代码片段)

一、协程是如何创建的?launch、async可以创建、启动新的协程,那么协程到底是如何创建的?runBlockingprintln(Thread.currentThread().name)launchprintln(Thread.currentThread().name)delay(100L)Thread.sleep(1000L)Logmain@coroutine#1main@coroutine#2Processfinished... 查看详情

kotlin协程源码分析-协程的启动(代码片段)

1.简单启动协程Demo本文例子代码地址:gitee.com/mcaotuman/k…写个小demo,先记住怎么用,后面再分析源码。三个挂起函数:输出结果:2.构建suspend修饰的lambda函数2.1suspendlambda下面这段代码是suspend修饰lambda表达式:v... 查看详情

深入理解kotlin协程协程的创建启动挂起函数理论篇(代码片段)

kotlin实现恢复挂起点是通过一个接口类Continuation(英文翻译过来叫"继续、延续、续体")来实现的。Kotlin续体有两个接口: Continuation 和 CancellableContinuation,顾名思义 CancellableContinuation 是一个可以取消的 Continuation... 查看详情

kotlin启动协程launch与async的区别按照顺序启动协程(代码片段)

 launch与async的区别binding.btClick5.setOnClickListener//主线程执行协程runBlocking//launch不会会返回执行结果valjob1=launchdelay(200)Log.e(TAG,"onCreate:jbo1finished.")//async会返回执行结果valjob2=asyncdelay(200) 查看详情

kotlin协程的四种启动模式(代码片段)

Default:协程创建后立即开始调度。在调度前如果协程被取消。将其直接进入取消相应的状态。ATOMIC:协程创建后。立即开始调度。协程执行到第一个挂起点之前不相应取消。LAZY:只有协程被需要时,包括主动调协程的... 查看详情

kotlin协程协程启动⑤(协程作用域构建器|runblocking函数|coroutinescope函数|supervisorscope函数)(代码片段)

文章目录一、结构化并发二、协程作用域构建器(runBlocking函数|coroutineScope函数)二、协程作用域构建器(coroutineScope函数|supervisorScope函数)1、协程作用域构建器概念2、coroutineScope协程作用域构建器示例3、supervisorScope协程作用域构建... 查看详情

kotlin协程协程启动⑤(协程作用域构建器|runblocking函数|coroutinescope函数|supervisorscope函数)(代码片段)

文章目录一、结构化并发二、协程作用域构建器(runBlocking函数|coroutineScope函数)二、协程作用域构建器(coroutineScope函数|supervisorScope函数)1、协程作用域构建器概念2、coroutineScope协程作用域构建器示例3、supervisorScope协程作用域构建... 查看详情

kotlin协程协程启动④(协程启动模式|协程构建器启动模式参数|default模式|atomic模式|lazy模式|undispatched模式)(代码片段)

...分析2、协程构建器CoroutineScope.async函数参数原型二、协程启动模式1、DEFAULT模式2、ATOMIC模式3、LAZY模式4、UNDISPATCHED模式5、CoroutineStart中定义的协程启动模式原型一、协程构建器CoroutineScop 查看详情

kotlin协程协程启动④(协程启动模式|协程构建器启动模式参数|default模式|atomic模式|lazy模式|undispatched模式)(代码片段)

...分析2、协程构建器CoroutineScope.async函数参数原型二、协程启动模式1、DEFAULT模式2、ATOMIC模式3、LAZY模式4、UNDISPATCHED模式5、CoroutineStart中定义的协程启动模式原型一、协程构建器CoroutineScop 查看详情

kotlin协程硬核解读(4.协程的创建和启动流程分析)(代码片段)

...函数1.5kotlin的函数类型Function1.6调用操作符()重载2.协程的启动、执行流程分析2.1CoroutineScope.launch()创建协程对象2.2initParentJob()父子Job绑定,传递取消2.3CoroutineStart启动模式调用2.4第二次创建SuspendLambda子类对象(协程对象包... 查看详情

kotlin协程硬核解读(4.协程的创建和启动流程分析)(代码片段)

...函数1.5kotlin的函数类型Function1.6调用操作符()重载2.协程的启动、执行流程分析2.1CoroutineScope.launch()创建协程对象2.2initParentJob()父子Job绑定,传递取消2.3CoroutineStart启动模式调用2.4第二次创建SuspendLambda子类对象(协程对象包... 查看详情

kotlin协程协程启动①(协程构建器|launch构建器|async构建器|runblocking函数|deferred类)(代码片段)

...、协程构建器1、协程构建器概念协程需要协程构建器来启动,协程构建器就是CoroutineScope协程作用域的两个扩展函数;协程构建器:协程有两种构建器,调用CoroutineScope协程作用域的如下两个构建起可启动协程;launch构 查看详情

kotlin协程协程启动①(协程构建器|launch构建器|async构建器|runblocking函数|deferred类)(代码片段)

...、协程构建器1、协程构建器概念协程需要协程构建器来启动,协程构建器就是CoroutineScope协程作用域的两个扩展函数;协程构建器:协程有两种构建器,调用CoroutineScope协程作用域的如下两个构建起可启动协程;launch构 查看详情

深入理解kotlin协程协程作用域启动模式调度器异常和取消使用篇(代码片段)

startCoroutine和createCoroutine这两个API不太适合在业务开发中直接使用,因此对于协程的创建,框架中提供了不同目的的协程构造器。这两组 API的差异在千Receiver的有无。Receiver通常用千约束和扩展协程体,剩下的部分就... 查看详情

kotlin协程协程启动③(协程组合并发|挂起函数串行执行|协程组合并发执行挂起函数)(代码片段)

文章目录一、挂起函数串行执行二、协程组合并发执行挂起函数一、挂起函数串行执行在协程体中,连续使用多个挂起函数,这些函数的执行是顺序执行的,挂起函数1执行完毕后,才执行挂起函数2;packagekim.hsl.coroutineimportandroid.os.Bundle... 查看详情

kotlin协程(代码片段)

一、CoroutineScope协程作用域,通过socpe启动一个或者多个协程,同一个socpe启动都算他的子协程GlobalScope//全局协程,生命周期与app相同,调度器是默认调度器,线程池MainScope()//在主线程启动协程默认调度器是Mai... 查看详情