Kotlin协程的理解

协程怎么理解

  • 一种在程序中处理并发任务的方案;也是该方案的一个组件
  • 协程和线程属于一个层级的概念
  • 协程中不存在线程,也不存在并行(并行不是并发)

协程的好处

  • 处理耗时任务,这种任务时常会堵塞主线程
  • 保证主线程安全,即确保安全地从主线程调用任何suspend函数
  • 协程让异步逻辑同步化,杜绝回调地狱
  • 协程最核心的点就是,函数或者一段程序能够挂起,稍后再在挂起的位置恢复

下面是关于协程这个概念的一些描述

协程的开发人员 Roman Elizarov 是这样描述协程的:协程就像非常轻量级的线程。线程是由系统调度
的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无
代价的,协程是由开发者控制的。所以协程也像用户态的线程,非常轻量级,一个线程中可以创建任意个协
程。
Coroutine,翻译成”协程“,初始碰到的人马上就会跟进程和线程两个概念联系起来。直接先说区别,
Coroutine是编译器级的,Process和Thread是操作系统级的。Coroutine的实现,通常是对某个语言
做相应的提议,然后通过后成编译器标准,然后编译器厂商来实现该机制。Process和Thread看起来也在
语言层次,但是内生原理却是操作系统先有这个东西,然后通过一定的API暴露给用户使用,两者在这里有
不同。Process和Thread是os通过调度算法,保存当前的上下文,然后从上次暂停的地方再次开始计算,
重新开始的地方不可预期,每次CPU计算的指令数量和代码跑过的CPU时间是相关的,跑到os分配的cpu时
间到达后就会被os强制挂起。Coroutine是编译器的魔术,通过插入相关的代码使得代码段能够实现分段
式的执行,重新开始的地方是yield关键字指定的,一次一定会跑到一个yield对应的地方
对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继
续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。协程能保留上一次调用时的状
态,不需要像线程一样用回调函数,所以性能上会有提升。缺点是本质是个单线程,不能利用到单个CPU的
多个核

扔物线表述

对某些语言,比如Kotlin,这样说是没有问题的,Kotlin的协程库可以指定协程运行的线程池,我们只
需要操作协程,必要的线程切换操作交给库,从这个角度来说,协程就是一个线程框架。

但理论上我们可以在单线程语言如JavaScript、Python上实现协程(事实上他们已经实现了协程),这时
我们再叫它线程框架可能就不合适了。

协程依赖

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0")

启动

1.协程需要运行在有协程上下文环境,在非协程环境凭空启动协程,有三种方式

  • GlobalScope.launch{}

在应用范围内启动一个协程,协程的生命周期与应用程序一致。这样启动的协程不能使线程保活,就像守护线程

由于这样启动的协程在启动协程的组件已被销毁但协程还存在的情况,可能导致资源耗尽,因此不推荐这样启动,尤其是在客户端这种需要频繁创建销毁组件的场景

  • 实现CoroutineScope + launch{}

这是在应用场景最推荐使用协程的方式,为自己的组件实现CoroutieScope接口,在需要的地方使用launch{}方法启动协程。使得协程和该组件生命周期绑定,组件销毁时,协程一并销毁。从而实现安全可靠的协程调用

  • runBlocking{}

启动一个新协程,并阻塞当前线程,直到内部逻辑以及子线程逻辑全部执行完成。
该方法的设计目的是让suspend在编写库中能够再常规堵塞代码中使用,常在main方法和测试中使用

2.在一个协程中启动子协程,一般来说有两种

  • launch{}

异步启动一个字写成

  • async{}

异步启动一个子协程,并返回Deffer对象,可通过调用Deffer.await()方法等待该子协程执行完成并获取结果,常用于并发-同步等待的情况

协程的挂起与恢复

  • 常规的函数基础操作包括,invoke(或Call)和return,协程新增了suspend和resume
    1.suspend 也称为挂起或者暂停,用于暂停执行当前协程,并保存所有局部变量(挂起点保存了)

2.resume 用于让已暂停的协程从其暂停处继续执行

  • 挂起函数
    1.使用suspend关键字修饰的函数叫做挂起函数

2.挂起函数只能在协程体内或者其他挂起函数内调用

调度器

  • 所有的协程都必须在调度器中运行,即使他们在主线程上也是如此
QQ20211214-161133@2x.png

如果协程没有指定调度器的话,默认在dispatchers.Default运行

任务泄露

  • 当某个协程任务丢失,无法追踪,导致内存、CPU、磁盘等资源浪费,甚至发送一个无用的网络请求,这种情况叫做任务泄露
  • 为了能够避免协程泄露,Kotlin引入了结构化并发机制

结构化并发

  • 取消任务,当某项任务不再需要时取消它
  • 追踪任务,当任务正在执行时,追踪它
  • 发出错误信号,当协程失败时,发出错误信号表明有错误发生
20211214-162408@2x.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容

  • 一、前言: 1、什么是协程? 协程可以理解就是一种用户空间线程(另外一种线程),他的调度是由程序员自己写程序来管理...
    因为我的心阅读 882评论 3 1
  • 摘要 协程更像是一种自动帮我们切换线程的工具,对于操作系统是透明的。此外,利用协程来写异步方法,也可以避免回调地狱...
    JalorOo阅读 683评论 0 0
  • 关于Kotlin协程的文章特别多,多数是按照官方教程翻译一遍,很多概念理解起来比较困惑,特别是协程的异常处理部分,...
    蜗牛是不是牛阅读 5,612评论 3 6
  • 概念 实际就是kotlin官方提供的线程API,相当于AsyncTask 特性:非阻塞挂起,可挂起/恢复执行 本质...
    Peakmain阅读 1,892评论 0 10
  • 本文章已授权微信公众号鸿洋(hongyangAndroid)转载。 本文章讲解的内容是在在Android中使用协程...
    谭嘉俊阅读 1,325评论 0 1