suspend 是kotlin中用于定义挂起函数的关键字.挂起函数是一种特殊类型的函数.可以在执行过程中暂时挂起并在稍微继续执行,而不会阻塞线程.挂起函数常用于协程中进行异步操作或长时间运行的计算,以避免阻塞主线程或其他线程.
定义挂起函数
suspend fun doSomething(){
delay(1000)
println("Doing something")
}
doSomething 是一个挂起函数.它适用了suspend关键字来标记该函数为挂起函数.在函数体内,可以执行一系列的操作,包括挂起函数 delay.该函数用于模拟一个耗时的操作.
需要注意的是: 挂起函数只能在其他挂起函数或协程作用域中使用. 在非协程环境中直接调用挂起函数会导致编译错误.
协程函数体中调用挂起函数
lifecycleScope.launch() {
withContext(Dispatchers.IO){
doSomething()
"更新数据~"
}.let {
withContext(Dispatchers.Main){
binding.tvText.setText(it)
}
}
}
总之: suspend关键字用于标记挂起函数.使其能够在执行过程中暂停并在稍后继续执行.这种机制使的异步操作可以以非阻塞的方式进行,提高了代码的可读性和维护性.
挂起与阻塞对比
通俗来讲:
- 挂起: 下班去消费,准备哈啤捋点小串. 你给老板说小串先烤着, 先去买点其他的东西,一会回来拿烤串.
在协程中,挂起是一种非阻塞的执行方式. 当协程遇到挂起的点时,它会暂停执行并释放线程资源,允许其他协程或任务在此执行.通过将执行权交给其他协程来实现异步操作. 例如等烧烤是一件耗时行为,当执行烧烤的时候 告诉老板先烤着一会过来拿,此时就释放线程资源,并允许烧烤任务在此执行.这个时候你可以去买其他东西,不阻碍活动.
- 阻塞: 等着老板烤串,等老板烤好了,再去买其他东西.
阻塞是一种阻塞式的执行方式.当一个线程遇到阻塞操作时,它会停止执行,并等待操作完成或条件满足,期间线程处于休眠状态,无法执行其他任务.
如上述例子: 就等烧烤,期间什么都不做. 等烧烤烤好了,再去买其他的.在此过程中没有释放资源,线程一直占用,无法用于执行其他任务.
var clickDelay: BindingCommand<*> = BindingCommand<Any?>(BindingAction {
GlobalScope.launch {
delay(5000)
Log.e("--------","delay")
}
})
var clickSleep: BindingCommand<*> = BindingCommand<Any?>(BindingAction {
Thread.sleep(5000)
Log.e("--------","sleep")
})
执行clickSleep函数, 控制台提示:
跳过了300帧! 该应用程序可能在其主线程上做了太多的工作。
如果时间设置稍微长一些,多点击clickSleep函数,程序直接就崩溃了.
执行clickDelay函数, 控制台提示:
挂起.png
总结:被suspend关键字修饰的函数是挂起函数.
挂起是一种非阻塞的执行方式,它通过释放线程资源来提高并发性和资源利用率. 阻塞是一种阻塞式的执行方式.它会占用线程资源,并可能导致性能低下和资源浪费.
网友评论