一、添加依赖
//协程核心库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.1"
//当前平台所对应的平台库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.1"
kotlin协程是什么
kotlin封装的线程框架,方便进行线程切换
二、第一个协程程序
//创建一个协程
GlobalScope.launch(Dispatchers.IO) {
}
//使用协程进行线程切换
GlobalScope.launch(Dispatchers.IO) {
println(Thread.currentThread().name)
launch(Dispatchers.Default) {
println(Thread.currentThread().name)
}
}
fun test01() {
println("开始执行->" + Thread.currentThread().name)
GlobalScope.launch {
println("执行协程->" + Thread.currentThread().name)
delay(3000)
println("协程结束->" + Thread.currentThread().name)
}
println("协程后运行的代码->" + Thread.currentThread().name)
sleep(6000L) // 阻塞主线程 6 秒钟来保证 JVM 存活
println("结束执行->" + Thread.currentThread().name)
}
-
GlobalScope,全局作用域,用于启动在整个应用程序生命周期内运行的顶级协程。
-
launch,CoroutineScope的扩展方法,用于启动协程。
四、withContext
这个函数可以切换到指定的线程,并在逻辑执行结束之后,自动把线程切回去继续执行
//使用协程进行线程切换
GlobalScope.launch {
println(1)
val result = withContext(Dispatchers.IO) {
delay(3000)
"aaa"
}
println(result)
}
三、suspend 挂起函数
launch 或者其他函数创建的协程,在执行到某一个 suspend 函数的时候,这个协程会从当前线程被「suspend」,也就是被挂起。
- 从当前线程挂起,换句话说,就是这个协程从正在执行它的线程上脱离
- 线程执行到了 suspend 函数这里的时候,就暂时不再执行剩余的协程代码,跳出协程的代码块,继续做其他事情,如果它是一个后台线程:
要么无事可做,被系统回收
要么继续执行别的后台任务
如果是主线程,就继续做其他主线程任务,刷新界面
- 挂起的代码会在指定其他线程执行,在执行完成之后,协程会重新切回它原先的线程
四、async
GlobalScope.launch {
println(1)
val result = withContext(Dispatchers.IO) {
delay(3000)
"aaa"
}
println(result)
val result1 = withContext(Dispatchers.IO) {
delay(3000)
"bbb"
}
println(result1)
}
//需要同时将两个异步工作的结果结合起来使用的情况
GlobalScope.launch {
val defer1 = async {
delay(3000)
"bbb"
}
val defer2 = async {
delay(4000)
"ccc"
}
println(defer1.await() + "-" + defer2.await())
}
sleep(10000)
网友评论