什么是协程

协程: 是一种更为灵活高效的"用户线程",能够选择异步还是同步执行,指定运行的线程。

异步、同步编程 : 是指的协程能够选择自身的启动模式,在当前线程堵塞式运行,还是在后台线程异步执行;

指定运行线程:能够方便的选择执行的线程是后台线程还是UI主线程;

在并发处理上会比使用线程来得更加的高效。

进程、线程、协程关系

进程 > 线程 > 协程, 即一个进程可以包含多个线程,一个线程上面可以运行多个协程。

启动方式

目前从非协程环境中启动协程环境主要有三种方式

启动方式 说明
runBlocking 创建新的协程,运行在当前线程上,所以会堵塞当前线程,直到协程体结束
GlobalScope.launch 启动一个新的线程,在新线程上创建运行协程,不堵塞当前线程
GlobalScope.asyn 启动一个新的线程,在新线程上创建运行协程,并且不堵塞当前线程,支持 通过await获取返回值

runBlocking

创建新的协程运行在当前线程上,所以会堵塞当前线程,直到协程体结束

适用范围

用于启动一个协程任务,通常只用于启动最外层的协程,例如线程环境切换到协程环境

示例

    /*** runBlocking创建新的协程运行在当前线程上,所以会堵塞当前线程,直到协程体结束** 适用范围: 用于启动一个协程任务,通常只用于启动最外层的协程,例如线程环境切换到协程环境。** 打印出:* current thread = main,1* runBlocking thread = main @coroutine#1,1* runBlocking end* current thread end*/@Testfun runBlockingTest() {println("current thread = ${Thread.currentThread().name},${Thread.currentThread().id}")//runBlocking运行在当前线程上,堵塞当前线程runBlocking {println("runBlocking thread = ${Thread.currentThread().name},${Thread.currentThread().id}")delay(1000)println("runBlocking end")}//等待runBlocking协程体内的内容执行完毕,才继续执行println("current thread end")}

GlobalScope.launch

创建新的协程,默认运行在后台新的线程中,并且不堵塞当前线程

适用范围

适用范围: 需要启动异步线程处理的情况

示例

    /*** GlobalScope.launch默认运行在后台新的调度线程中,并且不堵塞当前线程** 适用范围: 需要启动异步线程处理的情况** 输出:* current thread = main, 1* current thread end* launch thread = DefaultDispatcher-worker-2 @coroutine#1, 12* launch thread end*/@Testfun launchTest() {println("current thread = ${Thread.currentThread().name}, ${Thread.currentThread().id}")//launch启动后台调度线程,并且不堵塞当前线程GlobalScope.launch {println("launch thread = ${Thread.currentThread().name}, ${Thread.currentThread().id}")delay(1000)println("launch thread end")}println("current thread end")//当前线程休眠以便调度线程有机会执行Thread.sleep(3000)}

GlobalScope.async

创建新的协程,默认运行在后台新的线程中,并且不堵塞当前线程,支持通过await获取返回值

GlobalScope.async与GlobalScope.launch大致相同,

区别: 1.async返回类型为Deferred, launch返回类型为job
2.async可以在协程体中自定义返回值,并且通过Deferred.await堵塞当前线程等待接收async协程返回的类型。

适用范围

特别是需要启动异步线程处理并等待处理结果返回的场景

示例

    /*** async与launch的相同点:都是不堵塞当前线程并启动后台调度线程。* 区别: 1.async返回类型为Deferred, launch返回类型为job*       2.async可以在协程体中存在自定义的返回值,并且通过Deferred.await堵塞当前线程等待接收async协程返回的类型。** 适用范围: 特别是需要启动异步线程处理并等待处理结果返回的场景** 打印出:* current thread = main @coroutine#1, 1* current thread end* async thread = DefaultDispatcher-worker-1 @coroutine#2, 11* async end* result = 123*/@Testfun asyncTest() {runBlocking {println("current thread = ${Thread.currentThread().name}, ${Thread.currentThread().id}")//launch启动后台调度线程,并且不堵塞当前线程val deferred = GlobalScope.async {println("async thread = ${Thread.currentThread().name}, ${Thread.currentThread().id}")delay(1000)println("async end")//需要通过标签的方式返回return@async "123"}println("current thread end")val result = deferred.await()println("result = $result")//当前线程休眠以便调度线程有机会执行Thread.sleep(3000)}}

启动方式

目前从非协程环境中启动协程环境主要有三种方式

启动方式 说明
runBlocking 创建新的协程,运行在当前线程上,所以会堵塞当前线程,直到协程体结束
GlobalScope.launch 启动一个新的线程,在新线程上创建运行协程,不堵塞当前线程
GlobalScope.asyn 启动一个新的线程,在新线程上创建运行协程,并且不堵塞当前线程,支持 通过await获取返回值

runBlocking

创建新的协程运行在当前线程上,所以会堵塞当前线程,直到协程体结束

适用范围

用于启动一个协程任务,通常只用于启动最外层的协程,例如线程环境切换到协程环境

示例

    /*** runBlocking创建新的协程运行在当前线程上,所以会堵塞当前线程,直到协程体结束** 适用范围: 用于启动一个协程任务,通常只用于启动最外层的协程,例如线程环境切换到协程环境。** 打印出:* current thread = main,1* runBlocking thread = main @coroutine#1,1* runBlocking end* current thread end*/@Testfun runBlockingTest() {println("current thread = ${Thread.currentThread().name},${Thread.currentThread().id}")//runBlocking运行在当前线程上,堵塞当前线程runBlocking {println("runBlocking thread = ${Thread.currentThread().name},${Thread.currentThread().id}")delay(1000)println("runBlocking end")}//等待runBlocking协程体内的内容执行完毕,才继续执行println("current thread end")}

GlobalScope.launch

创建新的协程,默认运行在后台新的线程中,并且不堵塞当前线程

适用范围

适用范围: 需要启动异步线程处理的情况

示例

    /*** GlobalScope.launch默认运行在后台新的调度线程中,并且不堵塞当前线程** 适用范围: 需要启动异步线程处理的情况** 输出:* current thread = main, 1* current thread end* launch thread = DefaultDispatcher-worker-2 @coroutine#1, 12* launch thread end*/@Testfun launchTest() {println("current thread = ${Thread.currentThread().name}, ${Thread.currentThread().id}")//launch启动后台调度线程,并且不堵塞当前线程GlobalScope.launch {println("launch thread = ${Thread.currentThread().name}, ${Thread.currentThread().id}")delay(1000)println("launch thread end")}println("current thread end")//当前线程休眠以便调度线程有机会执行Thread.sleep(3000)}

GlobalScope.async

创建新的协程,默认运行在后台新的线程中,并且不堵塞当前线程,支持通过await获取返回值

GlobalScope.async与GlobalScope.launch大致相同,

区别: 1.async返回类型为Deferred, launch返回类型为job
2.async可以在协程体中自定义返回值,并且通过Deferred.await堵塞当前线程等待接收async协程返回的类型。

适用范围

特别是需要启动异步线程处理并等待处理结果返回的场景

示例

    /*** async与launch的相同点:都是不堵塞当前线程并启动后台调度线程。* 区别: 1.async返回类型为Deferred, launch返回类型为job*       2.async可以在协程体中存在自定义的返回值,并且通过Deferred.await堵塞当前线程等待接收async协程返回的类型。** 适用范围: 特别是需要启动异步线程处理并等待处理结果返回的场景** 打印出:* current thread = main @coroutine#1, 1* current thread end* async thread = DefaultDispatcher-worker-1 @coroutine#2, 11* async end* result = 123*/@Testfun asyncTest() {runBlocking {println("current thread = ${Thread.currentThread().name}, ${Thread.currentThread().id}")//launch启动后台调度线程,并且不堵塞当前线程val deferred = GlobalScope.async {println("async thread = ${Thread.currentThread().name}, ${Thread.currentThread().id}")delay(1000)println("async end")//需要通过标签的方式返回return@async "123"}println("current thread end")val result = deferred.await()println("result = $result")//当前线程休眠以便调度线程有机会执行Thread.sleep(3000)}}

微信公众号

协程入门(一):启动与挂起相关推荐

  1. Kotlin协程入门初级篇

    协程包含很多的功能点,这边只是一些基本功能点的介绍,只适合小白,已经掌握的可以忽略~ 协程入门(一):协程介绍与调用方式 协程入门(二):挂起与取消 协程入门(三):调度器 协程入门(四):启动模式 ...

  2. Kotlin学习笔记23 协程part3 lambda表达式深入 挂起函数 全局协程

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 lambda表达式深入 /*** lambda 表达式深入* 当函数参数是函数时 并且该函数只有一个参数 可以不传入任 ...

  3. android java协程,Android协程——入门

    一.如何使用协程 1.1 添加依赖 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0' implementatio ...

  4. python协程入门介绍

    协程,英文名Coroutines,全称协同程序,协程无法由操作系统来实现,因为操作系统只能调度到线程,协程是比线程还小的单位. 因此协程只能依靠程序员来实现,程序员写完程序,然后再大脑里大致模拟出程序 ...

  5. Kotlin学习笔记24 协程part4 协程的取消与超时

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 如何取消协程 import kotlinx.coroutines.*/*** 协程的取消*/fun main() = ...

  6. Kotlin协程:挂起与恢复原理逆向刨析

    前言:只有在那崎岖的小路上不畏艰险奋勇攀登的人,才有希望达到光辉的顶点. --马克思 前言 经过前面两篇协程的学习,我相信大家对协程的使用已经非常熟悉了.本着知其然更要知其之所以然的心态,很想知道它里 ...

  7. Kotlin实战指南十四:协程启动模式

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/96008400 本文出自[赵彦军的博客] 文章目录 协程启动 DEFAULT LA ...

  8. 协程的挂起、恢复和调度的原理 (二)

    目录 一. 协程的挂起.恢复和调度的设计思想 二. 深入解析协程 1. 协程的创建与启动 2. 协程的线程调度 3. 协程的挂起和恢复 4. 不同 resumeWith 的解析 5. 协程整体结构 一 ...

  9. pdf 深入理解kotlin协程_Kotlin协程实现原理:挂起与恢复

    今天我们来聊聊Kotlin的协程Coroutine. 如果你还没有接触过协程,推荐你先阅读这篇入门级文章What? 你还不知道Kotlin Coroutine? 如果你已经接触过协程,但对协程的原理存 ...

最新文章

  1. 合并两个对象 java_在Java中合并两个对象列表8
  2. java工单自动化流程控件,一种工单审批的自动化处理方法及系统与流程
  3. 重写equals和hashCode
  4. Lua-简洁、轻量、可扩展的脚本语言
  5. java不等于正整数怎么输入_关于java:测试输入是否为正整数
  6. java并发编程实践(1)intro
  7. tensor判断是否相等_PyTorch的Tensor(中)
  8. jQuery 源码系列(四)Tokens 词法分析
  9. D进制A+B(20)
  10. Chrome将网页背景变成黑色(真正的夜间模式、深色模式)
  11. OFDM信号的产生与解调
  12. Java Instrument(一) Java Agent
  13. 编程15年,如何才能成不了高手?
  14. C++单元测试框架Gtest的配置与使用过程
  15. 情侣的网站代码java_java版给爱人表白祝福的小项目
  16. sudo apt-get install build-essential的作用
  17. 文旅元宇宙热潮来袭,天下秀用“科技之钥”解锁三大价值
  18. 【佳学基因人工智能解码技术系列】在CENTOS环境下安装ANACOND
  19. 各种屏幕录像软件使用教程及效果对比
  20. 计算机在医学应用图片,数字图像处理技术在医学领域的应用

热门文章

  1. 西数硬盘固件刷新工具_一个1TB移动硬盘的数据恢复过程,含分析问题与解决方式...
  2. 腐蚀rust高速箭怎么做不了_高速公路波形护栏板安装时的设置要求
  3. 管理数据库计算机网络,计算机网络与数据库管理系统.pdf
  4. imac java7下载地址,如何在苹果电脑上安装JAVA开发工具,经验告诉你该这样
  5. stm8单片机例程下载链接
  6. NYOJ-背包问题(贪心)
  7. 我是如何解决jobtracker.info could only be replicated to 0 nodes, instead of 1这个问题的
  8. 环境配置:Qt5.5+VS2013+OpenCv3.1.0+Win7(64bit)
  9. js验证手机号码,邮箱,qq号
  10. Eclipse 常用快捷键(动画讲解)