You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
graph LR
A[开始] --> B[创建Channel]
B --> C[设置Channel缓冲区大小]
C --> D[发送数据至Channel]
D --> E[将数据放入缓冲区]
E --> F[接收Channel中的数据]
F --> G[从缓冲区获取数据]
G --> H[处理接收到的数据]
H --> I[循环接收数据]
I --> F[继续接收数据]
H --> J[结束]
一、操作环境
Kotlin:1.9.21
二、目标
阐明协程异步处理的正确使用
三、各种方法的定义
通过查阅资料,我整理了一个表格:
下面通过实际情况来理解它们。
四、launch
概述
launch函数会创建并执行一个线程。由于它在主线程之外运行,所以需要等待launch的线程完成。可以使用一个属性来检查线程的状态,需要巧妙地利用它来等待线程的结束。
检查状态的属性如下:
流程图
示例代码
五、async
概述
与 launch 的区别在于它可以返回一个返回值。返回值类型没有特殊限制,因此可以返回任何值。此外,在使用 launch 的情况下,我们使用属性来判断处理是否已完成。而在使用 async 的情况下,返回值是一个 Deferred 对象,它提供了一种等待处理完成的方法。此外,还可以进行取消操作,这是一种协作式的取消。
以下是接收方法结束和返回值的方法:
流程图
示例代码
Basic:
Cancel:
六、Channel
概述
Channel是一个可在主程序和协程中使用的容器。它不仅仅是一个容器,还可以让接收数据的线程等待,并让将数据放入Channel的线程等待发送,因为Channel中包含了数据。我们需要对数据进行流量控制,例如让线程等待。这就是Channel被称为热流的原因,它的特点是无论是否有接收者(取出值的处理)都会执行发送过程(放入数据)。
因此,需要采取以下预防措施。如果发送的次数没有收到数据,就会发生内存泄漏。换句话说,发送方的处理会继续进行,直到收到为止!
以下是发送和接收的方法:
流程图
示例代码
七、Channel Buffer
概述
Channel 是数据的容器,但到目前为止它只能存储单条数据。但是,可以通过设置缓冲区来存储多个数据。
流程图
示例代码
实例化 Channel 时,可以通过将整数传递给构造函数来设置缓冲区。
八、Channel Cancel&Close
概述
前面提到过 Channel 可能会导致内存泄漏,但是可以通过使用 cancel 和 close 来避免这种情况。
Cancel 和 Close 的方法说明如下:
流程图
Cancel:
Close:
示例代码
Cancel:
Close:
九、Flow
概述
Flow 称为冷流,其行为与热流 Channel 有很大不同。与 Channel 不同的是,除非确定了接收处理(collect方法),否则 Flow 不会执行发送处理(emit方法)。结果,Flow 将不会运行。因此,不会发生内存泄漏。此外,取消操作实现了协作式取消。
流程图
示例代码
Flow 的基本使用:
协作式取消:
十、总结
总结以上所述内容并考虑使用场景时,可以如下所示:
The text was updated successfully, but these errors were encountered: