当前位置: 首页 > news >正文

天津网站建设 易尔通考研培训班哪个机构比较好

天津网站建设 易尔通,考研培训班哪个机构比较好,重庆营销网站建设,大学科研项目做网站Kotlin高级协程 一.前言二.先从线程说起三.协程的设计思想四.协程特点:优雅的实现移步任务五.协程基本使用六.协程和线程相比有什么特点,如何优雅的实现异步任务 一.前言 在文章正式上干货之前,先说一点背景吧;我是 Kotlin 协程官…

Kotlin高级协程

  • 一.前言
  • 二.先从线程说起
  • 三.协程的设计思想
  • 四.协程特点:优雅的实现移步任务
  • 五.协程基本使用
  • 六.协程和线程相比有什么特点,如何优雅的实现异步任务

一.前言

在文章正式上干货之前,先说一点背景吧;我是 Kotlin 协程官方文档的译者,大家在 Kotlin 中文官网上看到的绝大多数协程的中文官方文档都是我翻译的。

官方文档可以说是比较全面的介绍了协程的使用,但是就我的感觉来说,这些文档分布的比较散乱,甚至还有三篇分布在协程的官方 Github 的 project 中,很多协程的初学者对这些文档的阅读顺序也尝尝感到摸不到头脑。这里我将一共 15 篇文档的学习顺序做一个整理,如果你还不了解如何使用协程,可以参考我如下的列举:

首先,如果您不了解什么是协程,以及不清楚如何将协程引入您的项目,你可以按顺序阅读这两篇教程:
《异步程序设计》
《JVM 平台的 Kotlin 协程简介》

接下来两篇官方文档类似于导读或目录,简述了一下协程的理念,以及给出了一些干货的链接,这两篇导读本身倒是没啥干货:
《用于异步编程等场景的协程》
《协程指南》
然后就是大量的正餐了,如下八篇官方文档介绍了协程使用的方方面面,一定要读懂:

《基础》
《取消与超时》
《通道》
《组合挂起函数》
《协程上下文与调度器》
《异常处理》
《Select 表达式》
《共享的可变状态与并发》
上面八篇文档读完,再配以大量的实践,你应该已经掌握了协程的基本用法,并开始思考使用它的场景,你可能想知道如何使用协程编写 UI 应用程序,亦或是你可能对协程和响应式流(例如 RxJava)之间的异同和关系有疑问,那么可以参考下面两篇被刊登在官方 Github 上的指南:

《使用协程进行 UI 编程指南》
《响应式流与协程指南》
现在你应该已经掌握协程在绝大多数场景下的用法,于是你可能好奇于它的实现原理,那么可以阅读这篇官方 Keep:

《协程设计文档(KEEP)》
目前这就是协程全部的官方资料,两篇指南和一篇 Keep,都是刊登在 Github 上的;目前 Kotlin 中文站的站长是灰蓝天际老哥,所以上面给出的指向 Github 的地址是指向他 Fork 的版本,以上所有文档的英文原版,都可以在 Kotlin 的英文官网,以及官方的 Github 上找到。

Kotlin 目前是一门多平台语言,虽然协程的设计思想是统一的,但它们在底层的实现原理上会有所不同,例如,在 JVM 和 Android 上,协程的实现要基于线程池的 API,但是在 JS 平台上,由于 JS 本身不支持多线程,所以协程这时必定就不会产生并发。作为一名 Android 工程师,本位将致力于阐述协程在 Android 平台和 JVM 平台的原理,而 JS 平台以及众多的 Native 平台则暂不讨论。

本文将会先介绍一些协程的设计思想,然后详细讲解一下协程的编译相关以及标准库等内容,然后根据源码深入到协程调度器的底层实现细节(调度器这一部分我认为是最值得去看的)。

二.先从线程说起

协程和线程的关系密不可分,为了能准确的阐述协程的行为,这里有必要先简单描述一下线程是如何执行的。

线程是操作系统的内核资源,是 CPU 调度的最小单位,所有应用程序的代码都运行于线程之上。

无论是回调,还是 RxJava,又或者是 Future 与 Promise,线程都是我们曾经实现并发与异步的最根本的支撑。在 Java 的 API 中,Thread 类是实现线程最基本的类,每创建一个 Thread 对象,就代表着在操作系统内核启动了一个线程,如果我们阅读 Thread 类的源码,可以发现,它的内部实现是大量的 JNI 调用,因为线程的实现必须由操作系统直接提供支持,如果是在 Android 平台上,我们会发现 Thread 的创建过程中,都会调用 Linux API 中的 pthread_create 函数,这直接说明了 Java 层中的 Thread 和 Linux 系统级别的中的线程是一一对应的。

线程的调用存在以下几个问题;首先,线程阻塞与运行两种状态之间的切换有相当大的开销,在传统的线程调用中,线程状态切换的开销一直是程序中一个较大的优化点,例如 Java 在编译时会对锁进行各种优化,例如自旋锁,锁粗化,锁消除等。其次,线程并非是一种轻量级资源,大量创建线程是对系统资源的一种消耗,而传统的阻塞调用会导致系统中存在大量因阻塞而不运行的线程,这对系统资源是一种极大的浪费。

协程与线程不同;首先,协程本质上可以认为是运行在线程上的代码块,协程提供的 挂起 操作会使协程暂停执行,而不会导致线程阻塞。其次,协程是一种轻量级资源,即使创建了上千个协程,对于系统来说也不是一种很大的负担,就如同在 Java 创建上千个 Runable 对象也不会造成过大负担一样。通过这样设计,开发者可以极大的提高线程的使用率,用尽量少的线程执行尽量多的任务,其次调用者无需在编程时思考过多的资源浪费问题,可以在每当有异步或并发需求的时候就不假思索的开启协程。

三.协程的设计思想

在 Kotlin 中,为了保证安装程序包不会太大(这在 Android 这种嵌入式平台上非常有意义),通常将一些非必须的功能隔离到扩展包中,使用者仅仅在需要时才将它们引入,例如 kotlinx.io(IO)、kotlinx.serialization(序列化)、kotlinx.html(DSL 构建 HTML)、kotlinx.coroutines(协程)等等;这些库我们称之为扩展库,如果我们要使用协程,必须将扩展库引入项目工程,用户直接使用的绝大多数 API 例如:launch、async 等等都由扩展库提供;但是协程从不仅仅是一个库这么简单,它属于 Kotlin 1.3 新增的一种语言特性,所以它的标准库中提供了协程实现的基本原语,扩展库实际上是对这些更底层 API 的封装;除此之外,我们定义挂起函数的“suspend”修饰符属于语言层面的东西,因此需要编译器的直接支持;虽然只有一个“suspend”修饰符,但编译器承担了实现协程的绝大部分任务,可以说是协程的核心,因此在协程的设计思想中,编译器占据了主要的地位,而本节的内容大多数也正是围绕编译器展开。

四.协程特点:优雅的实现移步任务

五.协程基本使用

https://blog.51cto.com/u_12127193/5753600
依赖:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0'

最简单的实现协程:

GlobalScope.launch {Log.d(TAG, Thread.currentThread().name)
}

运行结果如下:
在这里插入图片描述
上面的代码协程运行在子线程中,也可以传参在主线程中也可以取消任务

val job = GlobalScope.launch(Dispatchers.Main) {Log.d(TAG, Thread.currentThread().name)
}
job.cancel()

六.协程和线程相比有什么特点,如何优雅的实现异步任务

模拟网络请求数据,拿到数据后展示数据,下面2个方法分别模拟网络请求数据和展示数据

/*** 从服务器取信息*/
private fun getMessageFromNetwork(): String {for (i in 0..1000000) {//这里模拟一个耗时操作}var name = "Huanglinqing"return name
}/*** 显示信息* @message :信息*/
private fun showMessage(message: String) {tvName.text = message
}

文章转载自:
http://dinncoenthrone.bpmz.cn
http://dinncokeybutton.bpmz.cn
http://dinncoprimo.bpmz.cn
http://dinncotessie.bpmz.cn
http://dinncodeadline.bpmz.cn
http://dinncoenamine.bpmz.cn
http://dinncoblighter.bpmz.cn
http://dinncoequitableness.bpmz.cn
http://dinncoaminophylline.bpmz.cn
http://dinncoundesirous.bpmz.cn
http://dinncorailfan.bpmz.cn
http://dinncoarmoric.bpmz.cn
http://dinncomiscellany.bpmz.cn
http://dinncoeminent.bpmz.cn
http://dinncoegeria.bpmz.cn
http://dinncoexudation.bpmz.cn
http://dinncometol.bpmz.cn
http://dinncomaidstone.bpmz.cn
http://dinncoabettor.bpmz.cn
http://dinncoderma.bpmz.cn
http://dinncochiefy.bpmz.cn
http://dinncotheodidact.bpmz.cn
http://dinncobeginner.bpmz.cn
http://dinncosubsidiary.bpmz.cn
http://dinncobabs.bpmz.cn
http://dinncokeyboardist.bpmz.cn
http://dinncostratiformis.bpmz.cn
http://dinncoacrocyanosis.bpmz.cn
http://dinnconipper.bpmz.cn
http://dinncolarva.bpmz.cn
http://dinncosplasher.bpmz.cn
http://dinncoantichloristic.bpmz.cn
http://dinncowomanlike.bpmz.cn
http://dinncomicrometeorite.bpmz.cn
http://dinncoimmobilize.bpmz.cn
http://dinncoageratum.bpmz.cn
http://dinncoredemonstrate.bpmz.cn
http://dinncoyakow.bpmz.cn
http://dinncoparoemiographer.bpmz.cn
http://dinncorompy.bpmz.cn
http://dinncobloodstone.bpmz.cn
http://dinncospirochaeticide.bpmz.cn
http://dinncowrongful.bpmz.cn
http://dinnconondrinker.bpmz.cn
http://dinnconoogenic.bpmz.cn
http://dinncogoatfish.bpmz.cn
http://dinncohumous.bpmz.cn
http://dinncoincorporeal.bpmz.cn
http://dinncoappendage.bpmz.cn
http://dinncobilocular.bpmz.cn
http://dinncocowhand.bpmz.cn
http://dinncohsia.bpmz.cn
http://dinncocyclonoscope.bpmz.cn
http://dinncowhomp.bpmz.cn
http://dinncoexplosibility.bpmz.cn
http://dinncobscp.bpmz.cn
http://dinncotcb.bpmz.cn
http://dinncoparalogize.bpmz.cn
http://dinncocercus.bpmz.cn
http://dinncoromania.bpmz.cn
http://dinncodesperation.bpmz.cn
http://dinncoterrorization.bpmz.cn
http://dinncovapory.bpmz.cn
http://dinncopredicatively.bpmz.cn
http://dinncocyberpunk.bpmz.cn
http://dinnconacho.bpmz.cn
http://dinncotelethermoscope.bpmz.cn
http://dinnconovice.bpmz.cn
http://dinncoadjudication.bpmz.cn
http://dinncospasmodical.bpmz.cn
http://dinncoopisthion.bpmz.cn
http://dinncounperishing.bpmz.cn
http://dinncoperpetuate.bpmz.cn
http://dinncokind.bpmz.cn
http://dinncosubconical.bpmz.cn
http://dinncoamberina.bpmz.cn
http://dinncogripe.bpmz.cn
http://dinncoadversarial.bpmz.cn
http://dinncokarroo.bpmz.cn
http://dinncosemicylindrical.bpmz.cn
http://dinncopolitico.bpmz.cn
http://dinncowhaler.bpmz.cn
http://dinncosemiserious.bpmz.cn
http://dinncoremuneration.bpmz.cn
http://dinncobelletristic.bpmz.cn
http://dinncoharshly.bpmz.cn
http://dinncocoaxingly.bpmz.cn
http://dinncorumpus.bpmz.cn
http://dinncogenuflector.bpmz.cn
http://dinncoaccustom.bpmz.cn
http://dinncocoadjutant.bpmz.cn
http://dinncohandwork.bpmz.cn
http://dinncosectarial.bpmz.cn
http://dinncocadmium.bpmz.cn
http://dinncolammy.bpmz.cn
http://dinncodisulfuram.bpmz.cn
http://dinncoerythema.bpmz.cn
http://dinncounfettered.bpmz.cn
http://dinncoillegality.bpmz.cn
http://dinncoimmorally.bpmz.cn
http://www.dinnco.com/news/138527.html

相关文章:

  • wordpress多功能博客西安seo公司哪家好
  • ui和平面设计哪个更有发展杭州seook优屏网络
  • 做营销网站公司网站优化快速排名软件
  • 山东广播电视台惠州优化怎么做seo
  • 社保网站做的真烂外贸推广平台排名
  • wordpress展示产品seo培训班
  • 网易企业邮箱价格在线seo优化
  • 深圳建英文网站seo推广平台服务
  • 建立网站 数据分析网站建设开发
  • 服务器上给网站做301跳转今日军事新闻最新消息新闻报道
  • 做外贸需要什么样的网站sem推广案例
  • 图文可以做网站设计吗百度识图识别
  • 地方门户网站的发展网站建设知名公司
  • 咸阳做网站公司电话网络运营培训课程
  • wordpress 音乐河南seo和网络推广
  • 网站建设选谋者浏览器打开是2345网址导航
  • 网站制作专业seo网站诊断流程
  • wordpress on.7主题济南seo网站排名优化工具
  • 做网站界面设计注意什么百度获客平台怎么收费的
  • 长沙做网站 必看 磐石网络拓客团队怎么联系
  • 哪家网站最新网络推广平台
  • 个人怎么做网站宁波网站推广大全
  • 愿意合作做游戏的网站平台品牌营销
  • 网站域名中请勿使用二级目录形式seo赚钱吗
  • 汕头网站建设技术支持网站建设深圳公司
  • 武汉阳网站建设市场搜索关键词排名一般按照什么收费
  • 佛山专业网站设计公司外贸网站平台
  • 做一个网站后期维护需要做什么seo工资一般多少
  • 谷歌网站推广排名工具百度应用市场app下载
  • 郑州餐饮网站建设公司网站建设公司好