协程的概念

最早的协程概念出自1963年.经历多代发展.现在支持协程的编程语言有:Golang、Kotlin、C#、JS、Python等.

协程本来是指由编程语言自身负责调度任务,不借助操作系统与处理器功能的任务调度方式。本质就是非抢占式多任务,它当且仅当任务主动让出控制权时进行调度。这种调度从操作系统看起来其实就是同一个线程,只不过内部实现了非抢占式多任务,即:同时只能运行一个协程,其它协程只能等待,当前协程需要等待的时候主动把控制权让出来,让其它协程工作,这样就可以允许同一个线程内跑多个协程。

按调用栈分

协程分为有栈stackful和无栈stackless

Golang里的goroutine是有栈;JavaScript,Kotlin async/await是无栈

两者的含义不是指协程在运行时是否需要栈,一个函数调用另一个函数,总是存在调用栈的;而是指协程是否可以在其任意嵌套函数中被挂起.有栈协程是可以的,而无栈协程不可以
简要概括:

有栈协程(Stackful Coroutine): 每一个协程都有自己的调用栈,类似于线程的调用栈
无栈协程(Stackless Coroutine): 协程没有自己的调用栈,挂起点的状态由状态机或者闭包等语法来实现

优势比较:

有栈协程: 可以在任意函数调用层级的任意位置挂起,并转移调度权
无栈协程: 是不需要开辟栈空间,因此在内存紧张的程序上有优势

按调度方式分

协程分为对称和非对称
在协程调度过程中,根据协程调度权的转移目标的不同区分

简要概括:

对称协程(Symmetric Coroutine):任何一个协程都是相互独立且平等的,调度权可以在任意协程之间转移
非对称协程(Asymmetric Coroutine):协程出让调度权的目标只能是它的的调用者,即协程之间存在调用和被调用关系

kotlin协程

Kotlin协程常被认为是伪协程,是因为它并不在同一个线程运行,而是真的会创建多个线程,如果你创建了多个协程会发现程序实际运行在多个线程而不是一个线程上,这破坏了协程的定义.
其实这和协程的作用域有关.

总结来说:

  1. 一个线程一次只能运行一个协程
  2. 一个线程可以同时处理多个协程
    它可以挂起一个协程并运行一个不同的协程,但是在给定的时间点上,一个线程上只有一个协程在运行,不能在同一时间点在同一线程上运行多个协程

挂起的本质

协程挂起的是协程本身,协程可以看作是线程运行的指令序列,直到它遇到一个挂起点,在这个点上,协程挂起它的执行(保存调用堆栈和本地变量以便稍后恢复),并产生控制,在这种情况下,它不再在它运行的线程上运行.
通俗点解释就是: 从哪里挂起?从当前线程挂起,就是这个协程从正在执行它的线程上脱离.
挂起会让协程从正在执行它的线程上脱离

具体到代码其实是:
协程的代码块中,线程执行到了suspend 函数的时候,就暂时不再执行剩余的协程代码,跳出协程的代码块
那线程接下来会做什么呢?
如果它是一个后台线程:或者什么都不做,或者执行别的后台任务.

协程在执行到有 suspend 标记的函数的时候,会被suspend(被挂起),就是切个线程;挂起函数在执行完成之后,协程会重新切回它原先的线程,在 Kotlin 中的挂起,就是一个稍后会被自动切回来的线程调度操作

协程与kotlin协程挂起相关推荐

  1. 枯燥的Kotlin协程三部曲(上)——概念启蒙篇

    0x0.引言 Kotlin 1.3 版本开始引入协程 Coroutine,简练的官方文档和网上一堆浅尝辄止的文章让我心里有些没底,不想止步于仅仅知道: ① Android中,Kotlin协程用于解决: ...

  2. 分析Kotlin协程只挂起不恢复会怎样(是否存在协程泄漏),以及挂起的协程存在哪里?

    前言 刚开始正式学协程原理的时候(以前只是学api怎么用),大概是20年6月,也就是bennyhuo大佬出书<深入理解Kotlin协程>的时候,我买了本然后细细研究,我的内心就一直有一个问 ...

  3. pdf 深入理解kotlin协程_Kotlin协程实现原理:挂起与恢复

    今天我们来聊聊Kotlin的协程Coroutine. 如果你还没有接触过协程,推荐你先阅读这篇入门级文章What? 你还不知道Kotlin Coroutine? 如果你已经接触过协程,但对协程的原理存 ...

  4. Kotlin学习笔记23 协程part3 lambda表达式深入 挂起函数 全局协程

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 lambda表达式深入 /*** lambda 表达式深入* 当函数参数是函数时 并且该函数只有一个参数 可以不传入任 ...

  5. 破解 Kotlin 协程(6) - 协程挂起篇

    关键词:Kotlin 协程 协程挂起 任务挂起 suspend 非阻塞 协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞.不阻塞的挂起到底是怎么回事呢?说出来你也 ...

  6. Kotlin协程:挂起与恢复原理逆向刨析

    前言:只有在那崎岖的小路上不畏艰险奋勇攀登的人,才有希望达到光辉的顶点. --马克思 前言 经过前面两篇协程的学习,我相信大家对协程的使用已经非常熟悉了.本着知其然更要知其之所以然的心态,很想知道它里 ...

  7. Kotlin 协程:简单理解 runBlocking, launch ,withContext ,async,doAsync

    前言 Kotlin的协程,本质上是一个线程框架,它可以方便的切换线程的上下文(如主线程切换到子线程/子线程切回主线程).而平时我们要想在Android Studio使用协程,先要在gradle引入协程 ...

  8. 在 Android 开发中使用 Kotlin 协程 (一) -- 初识 Kotlin 协程

    前言 最近在研究 Kotlin 协程,发现功能真的超级强大,很有用,而且很好学,如果你正在或计划使用 Kotlin 开发 Android,那么 Kotlin 协程你一定不能错过! 协程是什么? 我们平 ...

  9. 动手实现Kotlin协程同步切换线程,以及Kotlin协程是如何实现线程切换的

    前言 突发奇想想搞一个同步切换线程的Kotlin协程,而不用各种withContext(){},可以减少嵌套且逻辑更清晰,想实现的结果如下图: 分析 实现我们想要的结果,首先需要知道协程为什么可以控制 ...

  10. Kotlin 协程 + Spring webflux 开发后端

    前言 后端响应式是未来,吞吐量会更大,而资源占用更少,其用到了类似Android系统的Loop(事件循环)机制,而协程可以减少线程等待的消耗,并且同步式的编程方式使代码可读性更高,两个仿佛天生就是一对 ...

最新文章

  1. docker 配置使用宿主机的GPU(ubuntu16.04+cuda10.0+cudnn7)
  2. Nature Genetics:微生物如何适应植物的?(articles)
  3. 时间序列(五)股票分析
  4. 光伏产品发展之路:从反倾销到欧盟加收税款
  5. python中处理日期和时间的标准模块是-Python时间相关处理
  6. Redis cluster原理
  7. [html] input上传文件可以同时选择多张吗?怎么设置?
  8. ftp 服务器 性能,FTP 服务器性能 测试点
  9. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)
  10. antd checkbox 默认选中_antd + select 默认选中问题?
  11. Linux查看so库访问的IP,linux-ip命令杂记
  12. java快速排列马桶,马桶Java :6.高性能MySQL语句(二)
  13. linux终端中出现 cd: OLDPWD 未设定 的提示
  14. Android中的USB中的UsbAccessory和UsbDevice的区别
  15. 【leetcode】1041. Robot Bounded In Circle
  16. mysql preparedstatement 批量update_Statement和PreparedStatement批量更新
  17. html图片边框显示不全,css border边框显示不完全
  18. 共模信号与差模信号(差分信号)
  19. 开发了一个监控网站与接口宕机,并推送 App 消息提醒的程序
  20. eureka相同服务名注册多个不同服务

热门文章

  1. uniapp 发布h5后报错,连接服务器超时,点击屏幕重试
  2. Openssl漏洞修复
  3. windows无法格式化u盘_如何解决u盘0字节无法格式化的问题
  4. 三星手机性能测试软件,5部手机性能测试:红米垫底三星倒数第三 第一当之无愧...
  5. windows多显示器任务栏设置:拖动窗口后任务栏显示在对应的显示器上
  6. 如何在Ubuntu上安装Couch DB 1.5
  7. 【element】progress-修改进度条形状、高度、颜色、动态传值
  8. 人生这么短,哪有空嫌晚
  9. java浪漫之心代码_浪漫桃心的Android表白程序
  10. Debezium报错处理系列一:The db history topic is missing.