kotlin 中的协程概念
1.kotlin的协程,是处理异步编程的一种简洁的方式。可以理解成更轻量的线程,或者是异步代码的同步写法。
本质上不是线程,可以理解是,线程在时间片段内,来回切换多个并发任务。
核心要点:
1.不是线程,是更轻的并发单元。
①一个线程,可以运行多个协程。
②创建成本,比线程低得多,划算得多。
解决的问题:
传统的回调地狱:
api.getUser{
user->
api.getProfile(user.id){profile->
api.getFriend(profile.id){
friends->{
//嵌套太深
}
}
}
::0}
协程的写法:(Rxjava过程繁琐)
suspend fun loadData{
val user =api.getUser();// 挂起,不阻塞线程。
val profile =api.getProfile(uesr.id);
val friends =api.getFriends(profile.id)
}
关键要素:
挂起函数 关键字: Suspend function
用Suspend 标记,可以在不阻塞线程的情况下,暂停执行。
只能在协程的函数中调用。
作用域:自动随Activity销毁而取消。
如果负协程取消,所有子协程全部取消。
并发与并行:
并发:
类比,一个小餐馆只有一个厨师,他擅长多任务处理:
9:00 开始炖汤
9:05 汤炖着时,他开始切菜
9:10 菜切好,汤还在炖,他准备炒锅...
一个厨师,看似同时处理多个任务,但本质是:在任务间快速切换,不设计线程的切换。
并行:
一家大餐厅有多个厨师:
厨师A 专门做汤,
厨师B 装满切菜
厨师C 专门炒菜
所有人,真正同时工作。需要多cpu,任务真正同时执行,适合场景是多进程,分布式任务。
// lanch 启动一个协程,让咖啡师做咖啡
val coffeejob = lanch{
1.告诉咖啡师,做一杯拿铁
val coffee =makeCoffee()//挂起点:等待咖啡制作。
5.咖啡师递给你
}
2.doOtherThings()//在等咖啡时,你不傻站,(不阻塞,可以看手机玩游戏---主线程继续做其他事情)
3.coffeejob.join();
suspend fun makeCoffee():String{
线程切换到Io线程,
delay(2000L)模拟耗时操作。
}
GlobalScope.lanch{
//这里启动的协程,独立于任何组件生命周期,它的生命周期跟应用程序一样长。
}
浙公网安备 33010602011771号