参考:
码上开学 | 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