Kotlin学习(八)—— 协程Coroutine基础

其实在Kotlin中,还有很多的概念没有去讲解,在后续的文章再去补充,我们先来一篇协程的基础介绍吧,协程是kotlin for android 中的一个重要概念,我们在加载一段数据的时候,最开始的使用方式是加载数据-等待数据-使用数据,这里是阻塞线程的一个操作,那么势必会出现卡顿等表现,后来我们有了回调,那么这个时候我们的操作步骤就变成加载数据 - 执行其他操作 - 回调数据 - 使用数据,不过回调很多人并不满意,觉得他麻烦和啰嗦,哪怕有Lambda表达式来简化这一层的操作,仍然不尽人意,而协程,就是改变这种方式的一个途径,协程主要是让原来要使用的异步 + 回调的方式简化成看似同步的方案。

要学习协程,可以先去温习一下java中的Thread,然后添加如下依赖:

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

我们先来看一段官方给出的例子

在这段例子中,我们虽然还不知道是什么意思,但是从注释中可以看到,我们启动了一个协程延迟一秒钟打印World,那么我们来看下日志的打印

可以看到,这段代码本身就是子线程的异步操作,如果我们换成Java的Thread,那么就是如下的代码了:

而打印的结果如下:

本质上,协程就是轻量级的线程。

一.挂起函数
在上面的协程代码中,我们可以看到,我们使用了一个函数delay来延迟一秒,看源码可以可以知道,他是一个suspend修饰的函数,我们称之为挂起函数,需要注意一点的是,挂起函数只能在协程内部使用,并且delay是非阻塞的,而Thread.sleep是阻塞的,而如果在kotlin中我们要想实现阻塞,实际上是有一个函数 runBlocking。

二. runBlocking 函数
我们还是回到最开始官方给出的那段代码中,我们启动了一个协程后,为了防止主进程直接结束了,所以我们通过Thread.sleep(2000L)来阻塞主线程 2 秒钟来保证 JVM 存活,这就是阻塞了线程直到内部的任务全部执行完毕,我们如果使用runBlocking来阻塞

代码差不多,看一下就能理解,我们也可以直接让我们的main函数包装,这也是我们的常用写法

runBlocking的设计之初并不是用来当做普通协程函数来使用的,而是用来桥接普通阻塞代码和挂起风格的非阻塞代码,比如在main函数或者测试案例当中。

三.join
我们通过延迟一段时间来等待程序结束,这很明显是不正确的,也就意味着,我们至始至终都要等待这么多的时候,那么我们为什么不等待这个协程结束就结束程序呢?为什么不呢?其实是可以的,我们来看下如下的这段代码

这段代码就比较自然了,等待这个协程结束就结束了。

四.结构化并发
结构化并发的概念取决于我们使用GlobalScope.launch创建一个协程的时候,实际上是创建了一个顶层的协程,也可以理解为是一个全局的协程,但是这样的话是有一个弊端的,也就是说我们如果挂起的时间过长,或者说创建的协程过多又没有去join,资源占用也会越来越大,那么我们这个时候如果使用结构化并发,就可以很好的解决这个问题了。

我们来看这段代码,我们包装了一个runBlocking,然后launch启动协程,外部协程有一个特点就是等到内部所有的任务执行后就会退出,也就是说,我们先打印Hello,再打印World后就帮助我们退出了。

五.作用域
当然,我们使用runBlocking前面也提到他是阻塞的,实际上我们还有一个非阻塞的作用域,那就是coroutineScope,我们来看下这段代码

这个执行顺序是什么知道吗?

可以看到,先走的是coroutineScope中的100L延迟,紧接着是200L,最后才是500L

六.取消
协程的取消只需要调用一下cancel就好了

七.超时
超时机制有时候对一些任务是非常有必要的,而且超时协程实现起来也简单

这段代码肯定会在三秒后超时,而超时则会出现如下异常

Github地址:
https://github.com/LiuGuiLinAndroid/Kotlin

如果有兴趣的话,可以加入我的Kotlin学习小组

我的公众号,期待你的关注

Kotlin协程是一种轻量级的线程处理机制,它可以在不创建新线程的情况下实现异步操作。Kotlin协程的优势在于它提供了一种结构化并发的方式,使得异步代码更加易于编写和维护。下面是深入理解Kotlin协程的一些方法和步骤: 1. 协程的基本概念:协程是一种轻量级的线程处理机制,它可以在不创建新线程的情况下实现异步操作。协程的本质是一种协作式的多任务处理机制,它可以在同一个线程中切换执行不同的任务,从而实现异步操作。 2. 协程的使用方法:在Kotlin中,协程的使用方法非常简单。首先需要导入kotlinx.coroutines库,然后使用launch函数创建一个协程。在协程中可以使用挂起函数来实现异步操作,例如delay函数可以让协程暂停一段时间。 3. 协程的挂起函数:协程的挂起函数是一种特殊的函数,它可以让协程暂停执行,等待某个条件满足后再继续执行。在Kotlin中,常用的挂起函数包括delay函数、withContext函数和async函数等。 4. 协程的上下文:协程的上下文是一种特殊的对象,它包含了协程的执行环境和状态信息。在Kotlin中,协程的上下文可以通过CoroutineContext对象来表示,它包含了协程的调度器、异常处理器和其他一些属性。 5. 协程的异常处理:协程的异常处理是一种特殊的机制,它可以让协程在发生异常时自动恢复或者终止执行。在Kotlin中,协程的异常处理可以通过try-catch语句或者CoroutineExceptionHandler对象来实现。 6. 协程的取消:协程的取消是一种特殊的机制,它可以让协程在不需要继续执行时自动终止。在Kotlin中,协程的取消可以通过cancel函数或者协程作用域来实现。 下面是一个使用Kotlin协程实现异步操作的例子: ```kotlin import kotlinx.coroutines.* fun main() = runBlocking { val job = launch { delay(1000L) println("World!") } println("Hello,") job.join() } ``` 输出结果为: ``` Hello, World! ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘某人程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值