Kotlin协程(上)

本文介绍了Kotlin协程的基础知识,包括launch、runBlocking、CoroutineContext、Job、CoroutineExceptionHandler等概念,以及如何进行协程的取消、超时处理和线程切换。还探讨了async和Deferred的使用,以及协程的懒加载模式。
摘要由CSDN通过智能技术生成

参考:
码上开学 | Bilibili
Kotlin: Using Coroutines | Pluralsight
一文快速入门kotlin协程 | 掘金

Kotlin Coroutine

消除并发任务之间的协作难度,打破回调地狱,可以在同一个代码块里实现多线程切换。

launch

launch——创建一个新的协程,并在指定线程上运行它,非阻塞。

launch(Dispatchers.IO){
   
	val image = getImage(imageId)
}

join

launch返回一个Job对象,通过Job.join()方法可以同步等待协程的完成。

fun main(args: Array<String>) = runBlocking<Unit> {
   
    val job = scope.launch {
    // launch new coroutine and keep a reference to its Job
        delay(1000L)
        println("World!")
    }
    println("Hello,")
    job.join() // wait until child coroutine completes
}

Cancelling coroutine execution

使用 Job.cancel() 方法可以取消一个协程。

val job1 = scope.launch {
   ...} 
val job2 = scope.launch {
   ...} 
//取消一个协程作用域将同时取消此作用域下的所有子协程
scope.cancel()
val job1 = scope.launch {
   }
val job2 = scope.launch {
   }
// 第一个协程被取消,第二个不受影响
job1.cancel()

job.cancelAndJoin() 替代

job.cancel()
job.join()

Making computation code cancellable

yield()——挂起函数,定期调用来检查取消操作。

fun main(args: Array<String>) = runBlocking<Unit> {
   
    val job = scope.launch {
   
        repeat(1000){
   
        	print(".")
        	yield()
        	Thread.sleep(1)
        }
    }
    delay(100)
    job.cancelAndJoin()
    println("done")
}

isActive——一个可通过 CoroutineScope 对象在协程内部使用的扩展属性,用于检测协程是否被取消。

fun main(args: Array<String>) = runBlocking<Unit> {
   
    val job = scope.launch {
   
        repeat(1000){
   
        	if(!isActive) throw CancellationException()//报出异常
        	print(".")
        	Thread.sleep(1)
        }
    }
    delay(100)
    job.cancelAndJoin()
    println("done")
}
fun 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值