首页
学习
活动
专区
圈层
工具
发布

Kotlin---使用协程的异步

协程间的通信 协程与协程间不能直接通过变量来访问数据,会导致数据原子性的问题,所以协程提供了一套Channel机制来在协程间传递数据。...目前,在1.3.11版本的Kotlin中,produce与consume都还只是实验性的功能,没有正式release,使用时记得使用@ExperimentalCoroutinesApi标记使用的函数 runBlocking...它启动了一个单独的协程,这是一个轻量级的线程并与其它所有的协程一起并发的工作。...,如果需要等待某个事件启动的话,则需要使用CoroutineStart.LAZY: val time = measureTimeMillis { val one = async(start =...协程与线程一样,对于数据的操作无法保持原子性,所以在协程中,需要使用原子性的数据结构,例如AotimicInteger等,或者使用mutex.withLock,来处理数据的原子性 import kotlinx.coroutines

3.3K20

【Kotlin 协程】协程简介 ( 协程概念 | 协程作用 | 创建 Android 工程并进行协程相关配置开发 | 异步任务与协程对比 )

文章目录 一、协程概念 二、协程作用 三、创建 Android 工程并进行协程相关配置 1、创建 Android 工程 2、配置协程环境 3、布局文件 4、异步任务代码示例 5、协程代码示例 6、完整代码示例...四、异步任务与协程对比 一、协程概念 ---- 协程 Coroutine 是 Kotlin 语言 中新出现的概念 , 在 Java 语言中没有 ; 协程 是 基于 线程 的 , 是 轻量级 线程 ;...; 异步任务 AsyncTask 也可以处理耗时操作 , 避免耗时任务阻塞线程 , 但是在 Android 11 中 , 官方规定 该 api 已过时 , 被标记为弃用状态 , 建议使用 协程 java.util.concurrent..., // 使用匿名内部类形式定义异步任务 , // Java 匿名内部类 对应 Kotlin 对象表达式..., // 使用匿名内部类形式定义异步任务 , // Java 匿名内部类 对应 Kotlin 对象表达式

6.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Kotlin协程-特殊的阻塞协程

    阻塞协程是种特殊的协程启动方式,一般是用 runBlocking{} 扩起来一段协程。...这里给出结果,改用GlobalScope.launch之后,子协程会在一个独立的线程里运行。 runBlocking 在kotlin协程官网上对于这个api的解释是桥接阻塞与非阻塞的世界。...但实际情况跟注释有点不同,如果在 runBlocking 中开一个 GlobalScope.launch,并且在里面延时很久,那么外面的线程其实是不会等待 GlobalScope 里的协程完成的。...没有的话就使用默认的eventloop。EventLoop是协程里对阻塞型coroutine进行调度的默认调度器。runBlocking和launch的主要区别就靠EventLoop实现。...在创建完coroutine后就进入派发流程了,这部分和Kotlin协程-一个协程的生命周期中的逻辑比较相似,下面也会讲到。

    3.2K20

    【Kotlin 协程】协程底层实现 ① ( Kotlin 协程分层架构 | 基础设施层 | 业务框架层 | 使用 Kotlin 协程基础设施层标准库 Api 实现协程 )

    文章目录 一、Kotlin 协程分层架构 二、使用 Kotlin 协程基础设施层标准库 Api 实现协程 一、Kotlin 协程分层架构 ---- Kotlin 协程分层架构 : 在 Kotlin 中..., 协程分为两层 ; 基础设施层 : Kotlin 提供了 协程 标准库 Api , 为协程提供 概念 , 语义 支持 , 是 协程 实现的基础 ; Kotlin 协程的底层支持 ; 基础 Api ;...业务框架层 : Kotlin 协程的 上层框架 , 使用方便 ; 在之前博客中使用的 GlobalScope 类 , launch 函数 , delay 挂起函数 等都属于 业务框架层 , 都是 Kotlin...协程 的上层实现 ; 在 基础 Api 的基础上 进行了一层封装 , 形成了方便开发者使用的框架 ; 基础设施层 : 基础设施层 的 协程基础 Api 定义在 kotlin.coroutines.*...Kotlin 协程基础设施层标准库 Api 实现协程 ---- 协程 需要使用 协程体定义 , 协程体格式如下 : suspend { // 协程体内容 } 协程体定义完之后 , 调用协程体的 createCoroutine

    1.4K10

    Python 异步: 等待有时间限制的协程(12)

    我们可以使用 asyncio.wait_for() 函数等待 asyncio 任务或协程超时完成。如果在任务完成之前超时已过,任务将被取消。 1....如何使用 Asyncio wait_for() asyncio.wait_for() 函数接受一个等待和超时。等待对象可能是协程或任务。必须指定超时,并且可以是无超时、整数或浮点秒数。...wait_for() 函数返回一个协程,该协程在明确等待或作为任务调度之前不会执行。...如果等待的任务因未处理的异常而失败,则该异常将传播回等待 wait_for() 协程的调用者,在这种情况下可能需要处理它。...带有超时的 Asyncio wait_for() 示例 我们可以探索如何在任务完成之前等待具有超时的协程。在此示例中,我们执行上述协程,但调用方等待 0.2 秒或 200 毫秒的固定超时。

    3.5K00

    Python 异步: 等待有时间限制的协程(12)

    我们可以使用 asyncio.wait_for() 函数等待 asyncio 任务或协程超时完成。如果在任务完成之前超时已过,任务将被取消。 1....如何使用 Asyncio wait_for() asyncio.wait_for() 函数接受一个等待和超时。等待对象可能是协程或任务。必须指定超时,并且可以是无超时、整数或浮点秒数。...wait_for() 函数返回一个协程,该协程在明确等待或作为任务调度之前不会执行。...如果等待的任务因未处理的异常而失败,则该异常将传播回等待 wait_for() 协程的调用者,在这种情况下可能需要处理它。...带有超时的 Asyncio wait_for() 示例 我们可以探索如何在任务完成之前等待具有超时的协程。在此示例中,我们执行上述协程,但调用方等待 0.2 秒或 200 毫秒的固定超时。

    2.9K50

    Kotlin协程开篇

    · 协程的核心是什么? · kotlin的协程和其他语言的协程有什么异同? kotlin的协程的出现其实比kotlin语言还晚一点。在当前这个版本,协程甚至都还处于一个不稳定的迭代版本中。...协程到目前为止都还没进入kotlin的标准库,它是一个独立的依赖库,叫 Kotlinx。对于想在开发中使用协程的人来说,需要在依赖里加入kotlinx-core依赖。...作为一个独立的依赖包,它的源码可以从github上获取,《Kotlin协程》分析的源码就是以github上的master分支为参考。 协程没那么难 协程的出现是为了解决异步编程中遇到的各种问题。...在Kotlin里使用协程非常方便, import kotlinx.coroutines.* fun main() { GlobalScope.launch { // 在后台启动一个新的协程并继续...用同步的方式写异步代码 这句话在很多资料中出现过,划重点。 理解这句话的关键在于,协程干了什么,让这个异步操作不会卡主线程?

    1.5K20

    Kotlin 协程总结

    1.简介 协程并不是 Kotlin 提出来的新概念,其他的一些编程语言,例如:Go、Python 等都可以在语言层面上实现协程,甚至是 Java,也可以通过使用扩展库来间接地支持协程。...不过,我们学习 Kotlin 中的协程,一开始确实可以从线程控制的角度来切入。因为在 Kotlin 中,协程的一个典型的使用场景就是线程控制。...现在先把这个概念放下,只需要记住协程就是这样写的就行了。 这种「用同步的方式写异步的代码」看起来很方便吧,那么我们来看看协程具体好在哪。...使用它就可以实现刚才提到的等待类型的耗时操作: suspend fun suspendUntilDone() { while (!...4,Kotlin 协程 的实战 5,漫画:什么是协程? 向大佬们致敬。

    4.4K11

    破解 Kotlin 协程(5) - 协程取消篇

    关键词:Kotlin 协程 协程取消 任务停止 协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...再谈 Retrofit 的协程扩展 4.1 Jake Wharton 的 Adapter 存在的问题 我在破解 Kotlin 协程 - 入门篇(https://www.bennyhuo.com/2019...父协程。 4.2 如何正确的将回调转换为协程 前面我们提到既然 adapt 方法不是 suspend 方法,那么我们是不是应该在其他位置创建协程呢?...) ,大家也可以直接添加依赖进行使用: compile 'ru.gildor.coroutines:kotlin-coroutines-retrofit:1.1.0' 这个框架代码量很少,但经过各路 Kotlin...最后我们还分析了一下 Retrofit 的协程扩展的一些问题和解决方法,这个例子也进一步可以引发我们对协程作用域以及如何将现有程序协程化的思考。

    2.5K50

    破解 Kotlin 协程(2) - 协程启动篇

    本文将为大家详细介绍协程的几种启动模式之间的不同,当然,我不打算现在就开始深入源码剖析原理,大家只需要记住这些规则就能很好的使用协程了。 1....JVM 上默认调度器的实现也许你已经猜到,没错,就是开了一个线程池,但区区几个线程足以调度成千上万个协程,而且每一个协程都有自己的调用栈,这与纯粹的开线程池去执行异步任务有本质的区别。...在 Nodejs 中,Kotlin 协程的默认调度器则并没有实现线程的切换,输出结果也会略有不同,这样似乎更符合 JavaScript 的执行逻辑。 更多调度器的话题,我们后续还会进一步讨论。...而对于 join, ... log(3) job.join() log(4) 因为要等待协程执行完毕,因此输出的结果一定是: 14:47:45:963 [main] 1 14:47:46:054 [main...,因此 1、2 会连续在同一线程中执行, delay 是挂起点,因此 3 会等 100ms 后再次调度,这时候 4 执行, join 要求等待协程执行完,因此等 3 输出后再执行 5。

    1.6K30

    破解 Kotlin 协程(3) - 协程调度篇

    关键词:Kotlin 异步编程 协程 上一篇我们知道了协程启动的几种模式,也通过示例认识了 launch 启动协程的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示协程的奥义。 ? 1....对比前面的 RxJava 的做法,你会发现这段代码其实很容易理解,你甚至会发现协程的使用场景与 RxJava 竟是如此的相似。...Kotlin 协程设计者也特别害怕大家注意不到这一点,还特地废弃了两个 API 并且开了一个 issue 说我们要重做这套 API,这两个可怜的家伙是谁呢?...如果大家在协程代码中使用锁之类的并发工具就反而增加了代码的复杂度,对此我的建议是大家在编写协程代码时尽量避免对外部作用域的可变变量进行引用,尽量使用参数传递而非对全局变量进行引用。...通过这个例子我们可以知道,实际上启动一个协程只需要有一个 lambda 表达式就可以了,想当年 Kotlin 1.1 刚发布的时候,我写了一系列的教程都是以标准库 API 为基础的,后来发现标准库的 API

    1.3K20

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

    关键词:Kotlin 协程 协程挂起 任务挂起 suspend 非阻塞 协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?...简单来说就是,对于 suspend 函数,不是一定要挂起的,可以在需要的时候挂起,也就是要等待的协程还没有执行完的时候,等待协程执行完再继续执行;而如果在开始 join 或者 await 或者其他 suspend...,需要等待结果,②③是协程已经执行完可以直接拿到异常和正常结果的两种情况。...就是 Kotlin 协程编译之后产生的字节码。...小结 不同以往,我们从这一篇开始毫无保留的为大家尝试揭示协程背后的逻辑,也许一时间可能有些难懂,不过不要紧,你可以使用协程一段时间之后再来阅读这些内容,相信一定会豁然开朗的。

    1.8K30

    异步与协程

    该模型三大特点:单线程、异步、非阻塞。 单线程是指执行用户代码(或者说事件循环)的时候只有一个线程,即主线程。但JavaScript的Runtime不是单线程的。异步指主线程不用等待任务结果返回。...协程 JavaScript异步编程大致经历了如下几个阶段:Callback、Promise、async/await。...协程通常解释为轻量级线程,一个线程上可以存在多个协程,但每次只能执行一个协程。协程的调度不牵涉到线程上下文的切换,不存在线程安全问题、相比线程有着更好的性能。...对比其它语言中的异步 其它编程平台如:.NET、Python也提供了async/await特性。在.NET中默认基于线程池来执行异步方法,Python则和JavaScript一样使用了协程。...异步I/O操作最终会委托操作系统来完成工作,不会阻塞应用线程从而提升应用响应能力。与JavaScript类似,asyncio通过事件循环机制+协程+task来实现异步编程。

    1.7K20

    【翻译】深入 Kotlin 协程

    【翻译】深入 Kotlin 协程 2017-10-26 by Liuqingwen | Tags: Kotlin 翻译 | Hits ? 一、前言 翻译好的文章也是一种学习方法!...我将会指导你使用协程相关的基本示例,并观察背后到底发生了什么。 为什么像协程这种解决方案非常有必要? 在现代应用程序开发中,处理多线程任务是不可避免的工作。...一边在 UI 上显示花哨的加载动画一边等待网络请求就是一个简单的例子,这不得不使用异步代码来解决。...那么让我们来看看具体怎样使用命令式的风格写出类似的异步代码吧! 如何使用协程? 协程基于一种新的函数类型,叫做挂起函数。我们可以在函数名称前使用一种新的语言关键字 suspend 来标记。...在 C# 5.0 中,追溯到 2012 年,关于异步函数微软提出了一个特性,非常类似 Kotlin 中的协程: public async Task doWork() { // do some

    2K10

    Kotlin协程系列(二)

    在进行业务开发时,我们通常会基于官方的协程框架(kotlinx.coroutines)来运用Kotlin协程优化异步逻辑,不过这个框架过于庞大和复杂,如果直接接触它容易被劝退。...所以,为了我们在后续的学习中游刃有余,在使用官方给出的复合协程时能够胸有成竹,我们暂且抛开它,按照它的思路实现一个轻量版的协程框架。...3.2实现join函数     join函数是一个挂起函数,他需要等待协程的执行,此时会有两种情况:被等待的协程已经执行完成,join函数就不会挂起,而是立马返回;被等待的协程尚未完成,此时join将协程挂起...协程需要调度的位置就是挂起点的位置,当协程执行到挂起点的位置时,如果产生了异步行为,协程就会在这个挂起点挂起,只有协程在挂起点正真挂起时,我们才有机会实现调度,而实现调度器需要使用协程的拦截器。...除了这三种作用域中提到的行为外,父子协程之间还存在以下规则: 父协程被取消,则所有的子协程均被取消 父协程需要等待子协程执行完毕后才最终进入完成状态 子协程会继承父协程的协程上下文中的元素,如果自身有相同的

    75510
    领券