协程是一种全新的处理并发的设计模式,说到并发,自然就想到异步,既然是异步,那么我们就想到很多处理异步的方式,比如Rxjava,Android开发中的Handler、异步任务、service等。

做为一个Android开发者,单开始用kotlin的时候,以为协程是kotlin才有,其实不是。

协程不是一个新的概念,而是很早之前就有,最早使用协程的编程语言可以追溯到 1967 年的 Simula 语言,在过去几年间,协程这个概念发展势头迅猛,现已经被诸多主流编程语言采用,比如 JavascriptC#Python、Ruby 以及 Go 等。Kotlin 的协程是基于来自其他语言的既定概念。

kotlin 在1.3开始引入协程。我们主要也kotlin的协程来讲解,然后再延伸到Android上。那么既然有很多处理并发的方法了,为什么还会用协程呢?先从以下几个概念来开始了解

什么是进程

进程就是一个程序的执行实例,一个app就是一个进程

什么是线程

线程属于进程,是最小的任务执行单位,一个进程有且只有一个主线程(在Android上就是UI线程)、若干子线程。

什么是协程

java处理并发时必须切换线程,线程是最小任务执行单位,并发时必须多个线程来处理
Kotlin中的协程提供了一种全新处理并发的方式(无需切换线程),轻量级的线程,可以使用它来简化异步执行的代码,它的目的就是在保证主线程(在Android上就是UI线程)安全的基础上处理耗时任务,协程依赖于线程存在,当线程销毁了,协程也就不存在了。

协程的特点

  • 轻量级的线程、开销小无成本、 数量几乎没有限制
  • 容易控制生命周期
  • 用同步的方式去表达异步
  • 依赖于当前线程,线程结束,协程也会结束
  • 运行在单线程中的并发处理

为什么使用协程

  • 避免了线程间的切换、调度、数据传递导致的性能、资源浪费

协程的核心

要了解协程的核心,先从一个关键字开始,那就是spend,suspend是暂停,挂起的意思,用于修饰函数,那么被suspend修饰的函数,就是挂起函数,此函数只能在协程中或者被另外一个suspend修饰的的函数调用。

协程代码块中遇到suspend函数,会将该函数挂起执行(可以理解为当前线程中虚拟一个子线程来执行挂起函数=异步,并没有切换线程也不会阻塞当前线程),挂起函数执行完毕以后,继续执行剩余协程代码块中代码,这是协程实现异步的核心!

我们主线程(Android中指UI线程)挂起是会阻塞UI界面的,但是利用协程的核心功能,在主线程中开启一个协程去处理耗时操作,可以很好的避免阻塞问题。

很多人会问,我直接在主线程开一个新的子线程做耗时操作不也一样的吗?

答案就是,是一样,效果上是一样,但是协程做法简单,上面也说了,可以避免协程间的切换、调度,资源浪费等,因为子线程操作完耗时操作后是要切换到主线程更新UI的,而协程可以做到可以不能切换线程也可以更新UI。

而且但业务逻辑复杂的情况下,比如并发三个请求,而且是三个请求是相互关联的,这种情况下用普通的处理异步操作是很累赘很麻烦的,用协程就不一样了。这里先卖个关,下一篇文章会讲到。

依照上面协程的核心,我们看个例子:

fun test() {GlobalScope.launch {val ret= sf1()Log.d...... //log2 thread name}Log.d......// log3 thread name
}
suspend fun sf1():Int{delay(2000)Log.d......// log1 thread name//todo
}
  • 以上代码在主线程被调用,log打印顺序是log3、log1、log2,sf1函数是可挂起函数,在协程中该函数被挂起,但并不会阻塞主线程!所以依旧先打印出了log3。
  • 而且如果在3个log打印处打印当前线程名称,得到的结果都是是 主线程!如果你之前没有了解过协程的概念,那这将会颠覆你对异步的认知,无需切换线程也能异步!而这仅仅是刚刚开始!
  • 通俗的表达:协程异步就是将耗时的函数标记为suspend,并在协程中调用!

以上就是针对什么是协程的一些内容,下一篇开始讲解协程的使用。

协程(一)——什么是协程相关推荐

  1. Go 知识点(14) — Go 多协程(单个协程触发panic会导致其它所有协程挂掉,每个协程只能捕获到自己的 panic 不能捕获其它协程)

    在多协程并发环境下,我们常常会碰到以下两个问题.假设我们现在有 2 个协程,我们叫它们协程 A 和 B . [问题1]如果协程 A 发生了 panic ,协程 B 是否会因为协程 A 的 panic ...

  2. 在 Android 开发中使用 Kotlin 协程 (一) -- 初识 Kotlin 协程

    前言 最近在研究 Kotlin 协程,发现功能真的超级强大,很有用,而且很好学,如果你正在或计划使用 Kotlin 开发 Android,那么 Kotlin 协程你一定不能错过! 协程是什么? 我们平 ...

  3. 10-线程,进程,协程,IO多路复用

    - 线程进程介绍 1. 工作最小单元是线程 2. 应用程序 -> 至少有一个进程 -> 至少有一个线程 3. 应用场景: IO密集型:线程 计算密集型:进程 4. GIL,全局解释器锁. ...

  4. python3之协程(3)---greenlet实现协程操作

    原文链接:https://www.cnblogs.com/xybaby/p/6337944.html 正文 在前面的文章中提到python原生的generator是semicoroutine,而gre ...

  5. go语言之进阶篇主协程先退出导致子协程没来得及调用

    1.主协程先退出导致子协程没来得及调用 示例: package mainimport ("fmt""time" )//主协程退出了,其它子协程也要跟着退出 fu ...

  6. python协程与多线程比较_python-协程、多线程、多进程性能比较

    基本概念 进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.进程是操作系统动态执行的基本单元. 线程:一个进程中包含若干线程,当然至少有一个线程,线程可以利用进程所拥有的资源.线程是独 ...

  7. python中协程的理解_python协程的理解

    一.介绍 什么是并发? 并发的本质就是切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制): 1.任务发生阻塞 2.计算任务时间过长,需要让出cpu给高 ...

  8. Kotlin学习笔记22 协程part2 join CoroutineScope 协程vs线程

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 Job的join方法 import kotlinx.coroutines.* /*** Job的join方法* 它会挂 ...

  9. linux的进程/线程/协程系列5:协程的发展复兴与实现现状

    协程的发展复兴与实现现状 前言 本篇摘要: 1. 协同制的发展史 1.1 协同工作制的提出 1.2 自顶向下,无需协同 1.3 协同式思想的应用 2. 协程的复兴 2.1 高并发带来的问题 2.2 制 ...

  10. php携程语比,PHP 协程

    理解生成器 参考官方文档:Generators 生成器让我们快速.简单地实现一个迭代器,而不需要创建一个实现了Iterator接口的类后,再实例化出一个对象. 一个生成器长什么样?如下 1 2 3 4 ...

最新文章

  1. IDEA 解决 Java8 的数据流问题,用过的都说好!!!
  2. 拆解交易系统--服务稳定性
  3. web访问 FastDFS 方法思路
  4. ArcGIS9.3全套下载地址
  5. SpringBoot2.0 以上 WebMvcConfigurerAdapter 方法过时 解决办法
  6. 安卓应用安全指南 4.1.2 创建/使用活动 规则书
  7. vim 系统剪切板及 ubuntu 无法使用 vim 系统剪贴板(或 :reg 无+号寄存器)
  8. 用c++编写的植物大战僵尸
  9. PHP中json对象转数组过程中去除字符串中的换行与数字方法
  10. 糖豆广场舞完成C轮融资,腾讯、顺为、GGV、IDG投资...
  11. matlab 仿真光学实验报告,光学信息处理实验的Matlab仿真.doc
  12. 计算机无法从usb启动不了,无法从u盘启动【设置思路】
  13. android 粘性控件,RecyclerView 粘性标签库: 可结合 BRVAH 使用
  14. 极值点偏移问题的处理策略及探究(作业帮的毕冶老师总结)
  15. Windows防火墙添加禁用规则——以禁用微信为例
  16. activiti实现的请假流程
  17. oracle 结果集已耗尽_java.sql.SQLException: 结果集已耗尽,解决方法!
  18. 百度地图经纬度计算距离(Java)
  19. 从优步僵尸车事件看源码保护的必要性
  20. 技术分享 | 浅谈滴滴派单算法

热门文章

  1. Cesium中文教程-Cesium Workshop(一)
  2. 大一计算机实验报告免费复制,大一计算机实验报告_相关文章专题_写写帮文库...
  3. 用Taylor公式估计函数值
  4. Matlab机器人工具箱(0)——旋转与平移变换
  5. 更新鼠标驱动和USB驱动的方法
  6. 王者该服务器未获取角色信息,王者荣耀体验服现实未获取角色信息 | 手游网游页游攻略大全...
  7. 深度学习数据不均衡的处理方法
  8. Centos7镜像下载步骤
  9. 雨林木风ghost系统安装图解教程
  10. ADAU1452和ADAU1466应该怎么做SPDIF输入和输出?(含图文+例程详解)