Kotlin-协程篇(并发设计模式)

作用:核心的作用就是用来简化异步执行的代码,避免了线程间的切换、调度、数据传递导致的性能、资源浪费,本质上是一种轻量级的线程。

解决的问题:

(1)处理耗时任务,这种任务常常会阻塞住主线程。

(2)保证主线程安全,即确保安全地从主线程调用任何 suspend 函数

特点:

轻量级的线程、开销小无成本、数量几乎没有限制

容易控制生命周期

用同步的方式去表达异步杜绝回调地狱.

依赖于当前线程,线程结束,协程也会结束

运行在单线程中的并发处理

主要使用方法

协程的挂起和恢复:

suspend --称为挂起或者暂停,用于暂时执行当前协程,并保存所有局部变量。

resume -用于让已暂停的协程从暂停处继续执行。

 我理解的挂起是,比如在主线程运行挂起函数,这个时候会记录下该挂起函数,但是不影响主线线程其他函数执行,等待挂起函数执行完成后,会再次恢复到主线程继续执行。挂起实现既可以不阻塞线程也可以直接获取异步或者耗时操作数据获得。

使用suspend 修饰的函数叫挂起函数,挂起函数只在协程体内或者其他挂起函数内使用。

协程挂起的实质:就是切个线程

协程就是切线程

挂起就是可以自动切回来的切线程

非阻塞式是用看起来阻塞的代码实现非阻塞的操作

suspend(协程的核心)

被suspend标记的函数称为可挂起函数,此类函数必须在协程中或者另外一个suspend标记的函数中调用,协程代码块中遇到suspend函数,会将该函数挂起执行,挂起函数执行完毕以后,继续执行剩余协程代码块中代码,这是协程实现异步的核心。

协程调度器

1. main 主线程

2. Io 对磁盘和网络Io做了优化,包括数据库,文件读写,网络处理。

]3. Default cpu密集型任务进行了优化,包括数组排序,json解析,处理差异判断

 协程的启动模式

1.Defaul:协程创建后立即开始调度,在调度前协程如果被取消了,就直接进入取消响应状态。

2.Atomic:协程创建后立即开始调度,协程执行到第一个挂起点之前不相应取消

3.Lazy: 只有协程被需要时,包括主动调用start join或者await等函数时才会开始调度,如果调度前就被取消,那么该协程将直接进入异常结束状态

4.Undispatched:协程创建后立即在当前函数调(注:在创建的协程的线程里执行)用栈种执行,直到遇到第一个正真挂起点。用到需要立即开始执行的需要这个方式。

 协程的作用域构建器

coroutineScope:是挂起函数,不阻塞当前线程,作用域内一个协程失败了,所有其他剩余协程都会被取消。

supervisorScope :是挂起函数,不阻塞当前线程,作用域内一个协程失败了,不会影响其他剩余协程。

Job对象

1.对于每个创建的协程都会返回一个job实例,该实例是协程的唯一标示,并且负责管理协程的生命周期。

2.job的生命周期包括 创建(new) 活跃(Active) 完成中 (completing)。已完成(completed) 取消中(canceling)和已取消(cancelled),虽然直接拿不到job的这些状态,但是可以空过is方法可以进行判断。

协程的取消

1. 取消作用域会取消它的子协程

2. 被取消的子协程不会影响其他兄弟协程

3. 协程通常会抛出特殊异常来处理取消操作

4. 所有kotinx.coroutines中的挂起函数(withContext delay)都是可以取消的。

Cup密集型任务取消

1. 使用isActiv 如果job不是活跃状态则不执行任务

2. 使用在运算代码前添加ensureActive()来抛出异常终止运算。

3. 使用在运算代码前添加Yield()来抛出异常来出让执行权给其他协程,达到暂时协程取消的目的。从而保障其他线程的正常运行。

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

推荐阅读更多精彩内容