1 协程基础
1.1 带问题理解协程
GlobalScope.launch(Dispatchers.Main) {
suspendSimpleDelay()
}
suspend fun suspendSimpleDelay(): Unit {
withContext(Dispatchers.IO) {
delay(10000)
}
}
1.2 Kotlin协程中挂起的是什么?
协程。
1.3 什么是协程?
kotlin协程为launch()、async() 等中的代码,协同多个程序之间进行合作,帮助我们轻松的写出复杂的并发代码。launch在创建的一个协程,在执行到某一个suspend函数(挂起函数)时,这个协程会被 suspend(被挂起)。
1.4 协程是执行在单线程中的吗?
协程本质上还是一套基于原生Java Thread API 的封装。只要没有魔改JVM,start了几个线程,操作系统就会创建几个线程;Kotlin协程只是做了一个类似线程池的封装,根本谈不上什么性能更好。协程是协作式任务,线程是抢占式任务,本质上两者都属于并发。
1.5 什么时候要用到协程的?
需要切换线程的时候要用到协程。
1.5.1 挂起是怎么做到的?
在suspend修饰的挂起函数中,调用另外一个协程自带的、内部实现了协程挂起代码的挂起函数withContext(),让它来做真正的挂起,实现线程切换的工作。
1.5.2 挂起的本质是什么?
挂起的本质是切线程。
1.5.3 既然suspend不能真正的做到挂起函数,那么suspend的作用是什么呢?
(1)作用是:提醒,提醒调用者该函数为耗时操作,避免主线程调用了一个耗时操作。因此创建一个挂起函数,一定要在内部调用别的挂起函数,否则这个挂起函数就是没有必要的。
(2)withContext的两种写法:
private suspend fun doWord(): Int {
// 写法1
withContext(Dispatchers.IO) {
delay(5000L)
LogUtils.d(TAG, "suspendLaunch World! ${Thread.currentThread()}")
}
return 1
}
private suspend fun doWord2(): Int = withContext(Dispatchers.IO) {
// 写法2
delay(5000L)
LogUtils.d(TAG, "suspend