Kotlin协程buffer缓冲池,调度任务执行

Kotlin协程buffer缓冲池,调度任务执行

Kotlin 复制代码
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.buffer
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.runBlocking

fun main() {
    runBlocking {
        val taskFlow = flow {
            repeat(10) { it ->
                val req = Req(it, (Math.random() * 9999).toInt())
                emit(req)
            }
        }

        taskFlow.onStart { println("onStart") }
            .onCompletion { println("onCompletion") }
            .onEach { it ->
                println("onEach $it ${System.currentTimeMillis()}")
            }.buffer(capacity = 3, onBufferOverflow = BufferOverflow.SUSPEND)
            .collect { it ->
                it.load()
            }
    }
}

class Req {
    var id = 0
    var priority = 0
    var timestamp = 0L

    constructor(id: Int, priority: Int) {
        this.id = id
        this.priority = priority
        this.timestamp = System.currentTimeMillis()
    }

    suspend fun load() {
        println("$this loading ...")
        val time = (Math.random() * 100).toLong()
        delay(time)
        println("$this loading time cost=$time")
    }

    override fun toString(): String {
        return "Req(id=$id, priority=$priority, timestamp=$timestamp)"
    }
}

输出:

onStart

onEach Req(id=0, priority=9545, timestamp=1765433999255) 1765433999263

onEach Req(id=1, priority=6391, timestamp=1765433999265) 1765433999265

onEach Req(id=2, priority=3125, timestamp=1765433999265) 1765433999265

onEach Req(id=3, priority=5451, timestamp=1765433999265) 1765433999265

onEach Req(id=4, priority=9302, timestamp=1765433999265) 1765433999265

Req(id=0, priority=9545, timestamp=1765433999255) loading ...

Req(id=0, priority=9545, timestamp=1765433999255) loading time cost=41

Req(id=1, priority=6391, timestamp=1765433999265) loading ...

onEach Req(id=5, priority=3988, timestamp=1765433999316) 1765433999316

Req(id=1, priority=6391, timestamp=1765433999265) loading time cost=92

Req(id=2, priority=3125, timestamp=1765433999265) loading ...

onEach Req(id=6, priority=7803, timestamp=1765433999424) 1765433999424

Req(id=2, priority=3125, timestamp=1765433999265) loading time cost=82

Req(id=3, priority=5451, timestamp=1765433999265) loading ...

onEach Req(id=7, priority=1557, timestamp=1765433999516) 1765433999516

Req(id=3, priority=5451, timestamp=1765433999265) loading time cost=57

Req(id=4, priority=9302, timestamp=1765433999265) loading ...

onEach Req(id=8, priority=7678, timestamp=1765433999579) 1765433999579

Req(id=4, priority=9302, timestamp=1765433999265) loading time cost=68

Req(id=5, priority=3988, timestamp=1765433999316) loading ...

onEach Req(id=9, priority=3493, timestamp=1765433999655) 1765433999655

Req(id=5, priority=3988, timestamp=1765433999316) loading time cost=97

Req(id=6, priority=7803, timestamp=1765433999424) loading ...

onCompletion

Req(id=6, priority=7803, timestamp=1765433999424) loading time cost=79

Req(id=7, priority=1557, timestamp=1765433999516) loading ...

Req(id=7, priority=1557, timestamp=1765433999516) loading time cost=19

Req(id=8, priority=7678, timestamp=1765433999579) loading ...

Req(id=8, priority=7678, timestamp=1765433999579) loading time cost=57

Req(id=9, priority=3493, timestamp=1765433999655) loading ...

Req(id=9, priority=3493, timestamp=1765433999655) loading time cost=41

Process finished with exit code 0

相关:

https://blog.csdn.net/zhangphil/article/details/154843029

https://blog.csdn.net/zhangphil/article/details/154840841

https://blog.csdn.net/zhangphil/article/details/132527122

相关推荐
唐青枫6 小时前
Kotlin Context Parameters 详解:别再把 Logger、事务和配置层层往下传
kotlin
Coffeeee7 小时前
如何使用Glide和Coil加载WebP动图
android·kotlin·glide
Kapaseker7 小时前
5 分钟搞懂 Kotlin DSL
android·kotlin
alexhilton1 天前
使用Android Archive进行打包
android·kotlin·android jetpack
逐光老顽童3 天前
Java 与 Kotlin 混合开发避坑指南:30 个真实案例实录
android·kotlin
plainGeekDev4 天前
null 判断 → Kotlin 可空类型
android·java·kotlin
plainGeekDev4 天前
getter/setter → Kotlin 属性
android·java·kotlin
Junerver4 天前
我写了一个 Compose Multiplatform 组件库,你可能会用到
kotlin·android jetpack
Ehtan_Zheng5 天前
Kotlin const val vs val:字节码、性能与隐藏陷阱详解
android·kotlin
zhangphil5 天前
大日志文件截取,从指定日志文件中提取两个标记字符串之间的全部内容,Kotlin
kotlin