kotlin协程管道Channel

kotlin协程管道Channel

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel

fun main(args: Array<String>) {
    val channel = Channel<Int>()

    runBlocking {
        launch {
            // 假设这里是耗时的生产者
            for (i in 0..4) {
                println("发送 $i")
                channel.send(i)
                println("发送 $i 完成")
                println("---")

                delay(100)
            }
        }

        repeat(5) {
            println("收到 ${channel.receive()}")
        }

        println("退出")
        channel.close()  // 关闭
    }
}

输出:

发送 0
发送 0 完成
---
收到 0
发送 1
发送 1 完成
---
收到 1
发送 2
发送 2 完成
---
收到 2
发送 3
发送 3 完成
---
收到 3
发送 4
发送 4 完成
---
收到 4
退出

也可以用for循环代替repeat:

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel

fun main(args: Array<String>) {
    val channel = Channel<Int>()

    runBlocking {
        launch {
            // 假设这里是耗时的生产者
            for (i in 0..4) {
                println("发送 $i")
                channel.send(i)
                println("发送 $i 完成")
                println("---")

                delay(100)
            }
        }

        for(j in channel) {
            println("收到 ${j}")
        }

        println("退出")
        channel.close()  // 关闭
    }
}

效果一样。

kotlin协程runBlocking 阻塞线程_zhangphil的博客-CSDN博客runBlocking 内部启动的3个协程做耗时操作,从输出可以看到3个协程交叉并发执行,runBlocking 会等到3个协程执行结束后才退出,输出结果有明确先后顺序。runBlocking 会等待相同作用域的协程完成才退出runBlocking 本身阻塞线程,但内部运行的协程又非阻塞。kotlin的runBlocking 当内部相同作用域的所有协程都运行结束后,在 runBlocking 之后的代码才能执行, runBlocking 会阻塞所在线程。https://blog.csdn.net/zhangphil/article/details/129263455

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/131096899