Kotlin 协程的四种启动模式

本文介绍了AndroidKotlin协程的四种启动策略:默认(CoroutineStart.DEFAULT)即创建后立即调度,原子(ATOMIC)在挂起点前不可取消,懒惰(LAZY)需主动调用start、join或await才开始,未调度(UNDISPATCHED)在当前函数栈执行。通过实例展示了不同策略下的行为差异和取消操作的结果。
摘要由CSDN通过智能技术生成

Default :协程创建后立即开始调度。在调度前如果协程被取消。将其直接进入取消相应的状态。

ATOMIC:协程创建后。立即开始调度。协程执行到第一个挂起点之前不相应取消。

LAZY:只有协程被需要时,包括主动调协程的start、join或者await等函数时,才会开始调度,如果调度前就被取消。那么该协程将直接进入异常状态。

UNDISPATCHED:协程创建后立即在当前函数调用栈中执行,直到遇到第一个真正挂起的点。

CoroutineStart.DEFAULT

代码案例

      binding.btClick7.setOnClickListener {
            runBlocking {
                val job = launch(start = CoroutineStart.DEFAULT) {
                    delay(10000)
                    Log.e(TAG, "onCreate: Job finished.")
                }
                delay(1000)
                job.cancel()
                Log.e(TAG, "onCreate: Job cancel.")
            }
        }

协程将不会执行

因为在执行的时候给取消了。

ATOMIC

        binding.btClick7.setOnClickListener {
            runBlocking {
                val job = launch(start = CoroutineStart.ATOMIC) {
                    //这里代码
                    
                    //这些任务一定会被执行
                    //到这里代码
                    //这里就是一个挂起点
                    delay(10000)
                    Log.e(TAG, "onCreate: Job finished.")
                }
                delay(1000)
                job.cancel()
                Log.e(TAG, "onCreate: Job cancel.")
            }
        }


就是到挂起函数之前的代码是不会被取消掉的。到了挂起点之后才可以进行取消

LAZY

        runBlocking {
                val job = async(start = CoroutineStart.LAZY) {
                    29
                }
                //执行计算
                //启动协程
 
 
                Log.e(TAG, "Completed job.start in ${job.start()} ms")
                //或者使用await
                job.cancel()
 
                job.await()
                job.join()
            }


job.cancel() 会进入异常状态。如果不进行await、join、或者是start操作 将不会被启动。

默认情况下

   val job = async(context = Dispatchers.IO, start = CoroutineStart.DEFAULT) {
                    Log.e(TAG, "thread:" + Thread.currentThread().name)
                }


会在子线程中执行

如果使用

UNDISPATCHED模式

      binding.btClick7.setOnClickListener {
            runBlocking {
                val job = async(context = Dispatchers.IO, start = CoroutineStart.UNDISPATCHED) {
                    Log.e(TAG, "thread:" + Thread.currentThread().name)
                }
 
            }
        }


则会打印出来主线程

底部的打印对应上面默认方式启动

为什么会打印出来主线程呢

协程创建后立即在当前函数调用栈中执行,因为是在主线程中执行。所以会在主线程执行。

UNDISPATCHED就是不转发的意思。


————————————————
版权声明:本文为CSDN博主「安果移不动」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mp624183768/article/details/125241189

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值