kotlin——launch&runblocking&async
协程
协程是语言层面的东西,线程是系统层面的东西
协程,本质上是一个线程框架,解决了异步编程时过多回调的问题
线程的切换会耗费系统资源,协程可以理解为线程里的‘多线程’,当然我们也可以直接理解这里的协程是线程,底层实现我们可以不深究
launch和runblocking
launch和runblocking,都可以在kotlin开启协程,区别在于launch是非阻塞的runblocking是阻塞的
这里有个语法糖则是在kotlin中,函数的最后一个参数是函数的话,可以使用大括号放在函数调用的后面,若前面参数不传递或只有这一个参数,则函数调用的小括号也可以省略,像list里的filter和map等函数都可以这么干
launch
launch开启的是一个非阻塞协程,程序不会等launch的代码执行完才往后执行
CoroutineScope(Dispatchers.Main).launch{ delay(500) //延时500ms }
协程体里的任务时就会先挂起(suspend),让CoroutineScope.launch后面的代码继续执行,直到协程体内的方法执行完成再自动切回来所在的上下文回调结
参数的意思是协程体里的代码运行在主线程,若参数为Dispatchers.IO则是运行在子线程里
runblocking
runblocking从名字就可以看出来,关于阻塞的一个函数,runblocking可以启动阻塞的协程
runBlocking{ delay(500) //延时500ms }
这段代码中主线程会立即执行runBlocking代码块里的任务,执行完了才会继续执行下面的代码
那就有疑问了,程序是顺序执行的,加不加runblocking又有什么区别呢
但我们如果在runBlocking里面再开启子协程搭配async使用,就能达到主线程等待runblocking,runblocking等待子协程执行完的效果
async
async是有返回值的协程调用方式,async的返回值是Deferred<T>,是延迟的意思
fun testAsync() { runBlocking { //启动协程 var job = GlobalScope.async { println("job1 start") Thread.sleep(10000) //返回值 "fish" } //等待协程执行结束,并返回协程结果 var result = job.await() println("result:$result") } }
Deferred的await可以拿到协程的返回结果,需要注意的是这个的await是不会阻塞的,只是挂起的意思,指只是将这个方法的执行给暂停了,等一会获取到结果再继续执行
fun main() { println("main start") val res = runBlocking { val res1 = async { 1 } val res2 = async { 2 } res1.await() + res2.await() } println(res) println("main end") }
像这样我们在runBlocking里面用了两个async协程,然后通过await的方式拿到返回值返回给res
所以async和runblocking搭配一起使用,可以达到开启多个协程异步执行操作,然后通过await拿到返回值,处理完你的业务逻辑,最后再继续执行主线程runblocking后面的代码的效果
references
https://juejin.cn/post/7128961903220490270
https://blog.csdn.net/zhong_zihao/article/details/105145206
https://juejin.cn/post/7107261954191785992
https://juejin.cn/post/7023806836696416293
https://juejin.cn/post/7108651566806073380
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2021-03-09 Filter过滤器