协程入门(一):启动与挂起
什么是协程
协程: 是一种更为灵活高效的"用户线程",能够选择异步还是同步执行,指定运行的线程。
异步、同步编程 : 是指的协程能够选择自身的启动模式,在当前线程堵塞式运行,还是在后台线程异步执行;
指定运行线程:能够方便的选择执行的线程是后台线程还是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)}}
微信公众号
协程入门(一):启动与挂起相关推荐
- Kotlin协程入门初级篇
协程包含很多的功能点,这边只是一些基本功能点的介绍,只适合小白,已经掌握的可以忽略~ 协程入门(一):协程介绍与调用方式 协程入门(二):挂起与取消 协程入门(三):调度器 协程入门(四):启动模式 ...
- Kotlin学习笔记23 协程part3 lambda表达式深入 挂起函数 全局协程
参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 lambda表达式深入 /*** lambda 表达式深入* 当函数参数是函数时 并且该函数只有一个参数 可以不传入任 ...
- android java协程,Android协程——入门
一.如何使用协程 1.1 添加依赖 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0' implementatio ...
- python协程入门介绍
协程,英文名Coroutines,全称协同程序,协程无法由操作系统来实现,因为操作系统只能调度到线程,协程是比线程还小的单位. 因此协程只能依靠程序员来实现,程序员写完程序,然后再大脑里大致模拟出程序 ...
- Kotlin学习笔记24 协程part4 协程的取消与超时
参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 如何取消协程 import kotlinx.coroutines.*/*** 协程的取消*/fun main() = ...
- Kotlin协程:挂起与恢复原理逆向刨析
前言:只有在那崎岖的小路上不畏艰险奋勇攀登的人,才有希望达到光辉的顶点. --马克思 前言 经过前面两篇协程的学习,我相信大家对协程的使用已经非常熟悉了.本着知其然更要知其之所以然的心态,很想知道它里 ...
- Kotlin实战指南十四:协程启动模式
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/96008400 本文出自[赵彦军的博客] 文章目录 协程启动 DEFAULT LA ...
- 协程的挂起、恢复和调度的原理 (二)
目录 一. 协程的挂起.恢复和调度的设计思想 二. 深入解析协程 1. 协程的创建与启动 2. 协程的线程调度 3. 协程的挂起和恢复 4. 不同 resumeWith 的解析 5. 协程整体结构 一 ...
- pdf 深入理解kotlin协程_Kotlin协程实现原理:挂起与恢复
今天我们来聊聊Kotlin的协程Coroutine. 如果你还没有接触过协程,推荐你先阅读这篇入门级文章What? 你还不知道Kotlin Coroutine? 如果你已经接触过协程,但对协程的原理存 ...
最新文章
- 合并两个对象 java_在Java中合并两个对象列表8
- java工单自动化流程控件,一种工单审批的自动化处理方法及系统与流程
- 重写equals和hashCode
- Lua-简洁、轻量、可扩展的脚本语言
- java不等于正整数怎么输入_关于java:测试输入是否为正整数
- java并发编程实践(1)intro
- tensor判断是否相等_PyTorch的Tensor(中)
- jQuery 源码系列(四)Tokens 词法分析
- D进制A+B(20)
- Chrome将网页背景变成黑色(真正的夜间模式、深色模式)
- OFDM信号的产生与解调
- Java Instrument(一) Java Agent
- 编程15年,如何才能成不了高手?
- C++单元测试框架Gtest的配置与使用过程
- 情侣的网站代码java_java版给爱人表白祝福的小项目
- sudo apt-get install build-essential的作用
- 文旅元宇宙热潮来袭,天下秀用“科技之钥”解锁三大价值
- 【佳学基因人工智能解码技术系列】在CENTOS环境下安装ANACOND
- 各种屏幕录像软件使用教程及效果对比
- 计算机在医学应用图片,数字图像处理技术在医学领域的应用
热门文章
- 西数硬盘固件刷新工具_一个1TB移动硬盘的数据恢复过程,含分析问题与解决方式...
- 腐蚀rust高速箭怎么做不了_高速公路波形护栏板安装时的设置要求
- 管理数据库计算机网络,计算机网络与数据库管理系统.pdf
- imac java7下载地址,如何在苹果电脑上安装JAVA开发工具,经验告诉你该这样
- stm8单片机例程下载链接
- NYOJ-背包问题(贪心)
- 我是如何解决jobtracker.info could only be replicated to 0 nodes, instead of 1这个问题的
- 环境配置:Qt5.5+VS2013+OpenCv3.1.0+Win7(64bit)
- js验证手机号码,邮箱,qq号
- Eclipse 常用快捷键(动画讲解)