美文网首页
kotlin 协程 二 (suspend)

kotlin 协程 二 (suspend)

作者: coke613 | 来源:发表于2023-07-05 15:02 被阅读0次
    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函数,程序直接就崩溃了.

    阻塞.png

    执行clickDelay函数, 控制台提示:


    挂起.png

    总结:被suspend关键字修饰的函数是挂起函数.
    挂起是一种非阻塞的执行方式,它通过释放线程资源来提高并发性和资源利用率. 阻塞是一种阻塞式的执行方式.它会占用线程资源,并可能导致性能低下和资源浪费.

    相关文章

      网友评论

          本文标题:kotlin 协程 二 (suspend)

          本文链接:https://www.haomeiwen.com/subject/zgkkudtx.html