美文网首页程序员
Kotlin 协程的非阻塞挂起

Kotlin 协程的非阻塞挂起

作者: YiiY34 | 来源:发表于2020-05-19 10:17 被阅读0次

    类似rxjava的线程框架
    可调度线程不需要回调

    image.png

    协程执行到中途调用suspend修饰的方法就是一个挂起操作

    需要注意的是suspend只能算是一个提醒


    image.png

    如果你创建一个 suspend 函数但它内部不包含真正的挂起逻辑,编译器会给你一个提醒:redundant suspend modifier,告诉你这个 suspend 是多余的。

    因为你这个函数实质上并没有发生挂起,那你这个 suspend 关键字只有一个效果:就是限制这个函数只能在协程里被调用,如果在非协程的代码中调用,就会编译不通过。

    所以,创建一个 suspend 函数,为了让它包含真正挂起的逻辑,要在它内部直接或间接调用 Kotlin 自带的 suspend 函数,你的这个 suspend 才是有意义的。

    重点了 什么是非阻塞挂起

    因为根据图一协程中[假设delay(5000)没有被注释 ] Log输出3需要需要等fun1执行完毕才会执行
    这里看起来明明就是阻塞的对吧

    从语义上理解「非阻塞式挂起」,讲的是「非阻塞式」这个是挂起的一个特点,也就是说,协程的挂起,就是非阻塞式的,协程是不讲「阻塞式的挂起」的概念的。
    我们讲「非阻塞式挂起」,其实它有几个前提:并没有限定在一个线程里说这件事,因为挂起这件事,本来就是涉及到多线程。
    就像视频里讲的,阻塞不阻塞,都是针对单线程讲的,一旦切了线程,肯定是非阻塞的,你都跑到别的线程了,之前的线程就自由了,可以继续做别的事情了。
    所以「非阻塞式挂起」,其实就是在讲协程在挂起的同时切线程这件事情。

    ps:因为它在写法上和单线程的阻塞式是一样的。协程只是在写法上「看起来阻塞」,其实是「非阻塞」的,因为在协程里面它做了很多工作,其中有一个就是帮我们切线程。

    相关文章

      网友评论

        本文标题:Kotlin 协程的非阻塞挂起

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