如果是应用的话,主要掌握框架级别的使用即可,语言级别的支持api来源于标准库,写起来比较麻烦也非常难理解。
这里launch会进行一次调度 ,delay会进行一次调度,每次调度完成会执行一次resume, 最终协程体执行完毕会执行一次resume, 所以内部有n个挂起点的协程体会执行n+2次resume.
DEFAULT 立即开始调度 和 UNDISPATCHED 立即开始执行协程体,这两个含义的区别是 DEFAULT 只是立即启动协程执行可能是异步的,而后者是直接执行协程体中的代码了。LAZY 是先创建协程体,然后在未来的某个时刻才去启动执行。
UNDISPATCHED 立即开始执行协程体,如果遇到挂起点,就切回主流程了,后面的协程体继续执行在单独的调度器。
import kotlinx.coroutines.*
@ExperimentalCoroutinesApi
suspend fun main() {
println("start")
testDefaultMode()
// testAtomicMode()
// testLazyMode()
// testUNDISPATCHEDMode()
println("finish")
}
suspend fun testDefaultMode() {
val defaultMode = GlobalScope.launch(start = CoroutineStart.DEFAULT) {
println("aaa")
delay(3000)
println("bbb")
}
println("222")
defaultMode.join()
}
@ExperimentalCoroutinesApi
suspend fun testAtomicMode() {
val defaultMode = GlobalScope.launch(start = CoroutineStart.ATOMIC) {
println("aaa")
delay(3000)
println("bbb")
}
println("222")
defaultMode.join()
}
suspend fun testLazyMode() {
val defaultMode = GlobalScope.async(start = CoroutineStart.LAZY) {
println("aaa")
delay(3000)
println("bbb")
}
println("222")
defaultMode.await()
}
@ExperimentalCoroutinesApi
suspend fun testUNDISPATCHEDMode() {
val defaultMode = GlobalScope.launch(start = CoroutineStart.UNDISPATCHED) {
println("aaa")
delay(3000)
println("bbb")
}
println("222")
defaultMode.join()
}
Default和IO线程的区别,IO内部多了一个队列的维护