作者pengrb Kotlin协程指南.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

作者pengrbKotlin

协程指南

目录

协程基础

第一个程序

桥接阻塞和非阻塞等待任务

提取函数重构协程是轻量级的

协程就像守护线程取消和超时

取消协程执行取消是合作性的

使计算代码可以取消最终关闭资源

运行不可取消块超时

挂起函数(Suspend)的组合默认顺序

使用异步并发异步懒加载

异步样式的函数

协程上下文(Context)及协程调度器(Dispatchers)协程调度器(Dispatchers)和线程(Thread)非限制和限制的协程调度

调试协程和线程线程之间的跳转任务中的Context

一个协程中的子协程

多个Context组合(“+”操作符)

给调试的协程取名(CoroutineName)通过显式取消Job

通道(Channel)

通道基础

通道基础

通道的关闭(close)和迭代(for)

构建通道生产者(ChannelProducers)管道(Pipelines)

管道生成素数

多输出(Fan-out,[多接收者])多输入(Fan-in,[多生产者])缓存通道(Bufferedchannels)

channel调用顺序是公平的(先进先出)共享的可变状态和并发性

问题

@Volatile是毫无帮助的

线程安全的数据结构(AtomicInteget)粒度的线程限制

粗粒度的线程限制互斥现象(Mutex)Actors

select表达式(selectR{...})

channel中select表达式(selectR{onReceive()...})close中的select表达式(selectR{onReceiveOrNull()...})send中的select表达式(selectR{onSend()...})Deferred中select表达式(selectR{onAwait...})

切换Deferred值的channel

协程基础

这部分包括协程的概念

第一个程序

运行一下代码:

运行结果:

从本质上来说,协程是属于轻量级线程,被协程构建器所启动,可以用launch(CommonPool){...}替换thread{...}和delay(...)替代Thread.sleep()从而获取相同效果

如果使用thread来替换launch(CommonPool){...}启动协程,编译器会报错:

那是因为delay是一个特殊的挂起函数,它不会阻塞一个线程,而是暂停协程(Coroutine),只能在协程中使用

桥接阻塞和非阻塞

第一个例子在main方法中混合了非阻塞的delay()和阻塞的Thread.sleep(),那样有点混乱,可以使用runBlocking来区分:

运行结果:

运行结果一样,但这段代码只使用于非阻塞的delay,而runBlocking{}被作为一个顶层的主协程的适配器,运行runBlocking代码块以外的常规代码,知道运行runBlocking中的协程是存活的

其实runBlocking{}是用来阻塞当前线程而运行新的协程(coroutine),直到该协程执行完,runBlocking不应该被用在协程(coroutine)中,它的设计目的是为了将常规线程的阻塞代码连接到协程暂停而编写的库,一般主要用于main方法或者测试用例

为suspending函数编写一个单元测试:

等待任务

使用延时来让另一个协程执行任务不是一个好的方式,可以使用job.join()非阻塞的明确等待协程执行完所做的

后台工作

运行结果:

运行结果还是一样,但可以看到现在主协程与后台执行的子协程并没有以任何延时的代码方式相关联

提取函数重构

将launch(CommonPool){}中的代码块提取到一个单独的函数中,当对此代码执行Extractfunction重构时,可以获取一个带有suspend修饰符的新函数,他是一个延时函数,suspend函数可以类型普通函数一样在协程Coroutine中被调用,而且它还可以使用其他协程的延时函数,比如delay()函数暂停执行一个协程Coroutine

协程是轻量级的

运行下面代码:

它启动100k协程,1秒后每个协程打印一个点,如果尝试使用线程来实现,可能会内存溢出

协程就像守护线程

以下代码启动一个长时间运行的协程,每秒打印一次“我正在睡觉”,然后延迟一段时间后返回main函数:

运行结果:

协程并不能使整个过程处于存活,反而它们却像守护线程一样

取消和超时

这部分包含协程的取消和超时

取消协程执行

在小应用中,一般主要从main方法的返回可以让所有的协程Coroutine隐式终止,但是在较大、长时间运行的程序中,则需要更细微的控制,使用laun

文档评论(0)

MAX知识点 + 关注
实名认证
文档贡献者

资料收集达人

版权声明书
用户编号:8053033065000020

1亿VIP精品文档

相关文档