Kotlin协程flow缓冲buffer任务流,批次任务中选取优先级最高任务最先运行(二)

Kotlin协程flow缓冲buffer任务流,批次任务中选取优先级最高任务最先运行(二)

collect在这里面相当于一个触发器,一次一次的匀速将缓冲过的数据流发射出来。

Kotlin 复制代码
import kotlinx.coroutines.async
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.buffer
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.newFixedThreadPoolContext
import kotlinx.coroutines.runBlocking
import java.util.UUID

val mChannel = Channel<TaskInfo>()
val mThreadPool = newFixedThreadPoolContext(nThreads = 4, name = "my-thread")

fun main() {
    val bufferCapacity = 5
    val totalTaskSize = 20

    val taskList = mutableListOf<TaskInfo>()

    var count = 0

    runBlocking {
        //接收任务
        async {
            mChannel.receiveAsFlow()
                .buffer(bufferCapacity)
                .onEach { it ->  //生产者
                    println("onEach $it at time=${System.currentTimeMillis()} ${Thread.currentThread().name}")
                    taskList.add(it)
                }.flowOn(mThreadPool)
                .collect { it -> //消费者
                    //collect, 这里相当于通过缓冲后匀速发射过来的触发器(trigger)。
                    println("collect $it count:${++count}/$totalTaskSize ${Thread.currentThread().name}")

                    val newOrderList = taskList.sortedBy { it.priority }
                    newOrderList.forEach {
                        print("${it.priority} ")
                    }
                    val lastTaskInfo = newOrderList.lastOrNull()
                    println("\n最大优先级任务:$lastTaskInfo")
                    taskList.remove(lastTaskInfo)

                    lastTaskInfo?.let {
                        loader(it)
                    }
                }
        }

        //源源不断的密集发送加载任务。
        async {
            repeat(totalTaskSize) { it ->
                enqueue(it)
            }
        }
    }
}

private suspend fun enqueue(id: Int) {
    val taskInfo = TaskInfo(id, (Math.random() * 99999).toInt())
    println("enqueue $taskInfo at time=${System.currentTimeMillis()}")
    mChannel.send(taskInfo)
}

//假设这里是真正的耗时任务执行体
private fun loader(info: TaskInfo) {
    runBlocking {
        async(mThreadPool) {
            println("load start $info @time=${System.currentTimeMillis()} ${Thread.currentThread().name}")
            delay(100)
            println("load end $info @time=${System.currentTimeMillis()} ${Thread.currentThread().name}")
        }
    }
}

class TaskInfo {
    var id = 0
    var priority = 0
    val taskId: UUID? = UUID.randomUUID()

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

    override fun equals(other: Any?): Boolean {
        return taskId == (other as TaskInfo).taskId
    }

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

输出:

enqueue TaskInfo(id=0, priority=19711) at time=1766038941546

enqueue TaskInfo(id=1, priority=10306) at time=1766038941548

enqueue TaskInfo(id=2, priority=75603) at time=1766038941550

onEach TaskInfo(id=0, priority=19711) at time=1766038941550 my-thread-1

collect TaskInfo(id=0, priority=19711) count:1/20 main

onEach TaskInfo(id=1, priority=10306) at time=1766038941550 my-thread-3

onEach TaskInfo(id=2, priority=75603) at time=1766038941550 my-thread-3

10306 19711 75603

最大优先级任务:TaskInfo(id=2, priority=75603)

enqueue TaskInfo(id=3, priority=24922) at time=1766038941580

enqueue TaskInfo(id=4, priority=26445) at time=1766038941580

onEach TaskInfo(id=3, priority=24922) at time=1766038941580 my-thread-1

onEach TaskInfo(id=4, priority=26445) at time=1766038941580 my-thread-1

load start TaskInfo(id=2, priority=75603) @time=1766038941581 my-thread-2

enqueue TaskInfo(id=5, priority=79635) at time=1766038941581

enqueue TaskInfo(id=6, priority=79166) at time=1766038941582

onEach TaskInfo(id=5, priority=79635) at time=1766038941582 my-thread-4

onEach TaskInfo(id=6, priority=79166) at time=1766038941582 my-thread-4

enqueue TaskInfo(id=7, priority=10775) at time=1766038941582

enqueue TaskInfo(id=8, priority=89017) at time=1766038941583

onEach TaskInfo(id=7, priority=10775) at time=1766038941583 my-thread-3

onEach TaskInfo(id=8, priority=89017) at time=1766038941583 my-thread-3

enqueue TaskInfo(id=9, priority=85067) at time=1766038941583

onEach TaskInfo(id=9, priority=85067) at time=1766038941583 my-thread-1

enqueue TaskInfo(id=10, priority=48024) at time=1766038941583

enqueue TaskInfo(id=11, priority=79413) at time=1766038941583

onEach TaskInfo(id=10, priority=48024) at time=1766038941583 my-thread-1

onEach TaskInfo(id=11, priority=79413) at time=1766038941584 my-thread-1

enqueue TaskInfo(id=12, priority=47049) at time=1766038941584

enqueue TaskInfo(id=13, priority=45293) at time=1766038941584

onEach TaskInfo(id=12, priority=47049) at time=1766038941584 my-thread-1

enqueue TaskInfo(id=14, priority=68107) at time=1766038941584

onEach TaskInfo(id=13, priority=45293) at time=1766038941584 my-thread-1

onEach TaskInfo(id=14, priority=68107) at time=1766038941584 my-thread-1

enqueue TaskInfo(id=15, priority=28371) at time=1766038941584

enqueue TaskInfo(id=16, priority=7603) at time=1766038941585

onEach TaskInfo(id=15, priority=28371) at time=1766038941585 my-thread-2

onEach TaskInfo(id=16, priority=7603) at time=1766038941585 my-thread-2

enqueue TaskInfo(id=17, priority=42919) at time=1766038941585

enqueue TaskInfo(id=18, priority=77275) at time=1766038941585

onEach TaskInfo(id=17, priority=42919) at time=1766038941585 my-thread-3

enqueue TaskInfo(id=19, priority=71741) at time=1766038941585

onEach TaskInfo(id=18, priority=77275) at time=1766038941585 my-thread-2

onEach TaskInfo(id=19, priority=71741) at time=1766038941586 my-thread-1

load end TaskInfo(id=2, priority=75603) @time=1766038941688 my-thread-4

collect TaskInfo(id=1, priority=10306) count:2/20 main

7603 10306 10775 19711 24922 26445 28371 42919 45293 47049 48024 68107 71741 77275 79166 79413 79635 85067 89017

最大优先级任务:TaskInfo(id=8, priority=89017)

load start TaskInfo(id=8, priority=89017) @time=1766038941689 my-thread-2

load end TaskInfo(id=8, priority=89017) @time=1766038941798 my-thread-3

collect TaskInfo(id=2, priority=75603) count:3/20 main

7603 10306 10775 19711 24922 26445 28371 42919 45293 47049 48024 68107 71741 77275 79166 79413 79635 85067

最大优先级任务:TaskInfo(id=9, priority=85067)

load start TaskInfo(id=9, priority=85067) @time=1766038941799 my-thread-1

load end TaskInfo(id=9, priority=85067) @time=1766038941905 my-thread-4

collect TaskInfo(id=3, priority=24922) count:4/20 main

7603 10306 10775 19711 24922 26445 28371 42919 45293 47049 48024 68107 71741 77275 79166 79413 79635

最大优先级任务:TaskInfo(id=5, priority=79635)

load start TaskInfo(id=5, priority=79635) @time=1766038941906 my-thread-2

load end TaskInfo(id=5, priority=79635) @time=1766038942013 my-thread-3

collect TaskInfo(id=4, priority=26445) count:5/20 main

7603 10306 10775 19711 24922 26445 28371 42919 45293 47049 48024 68107 71741 77275 79166 79413

最大优先级任务:TaskInfo(id=11, priority=79413)

load start TaskInfo(id=11, priority=79413) @time=1766038942014 my-thread-1

load end TaskInfo(id=11, priority=79413) @time=1766038942122 my-thread-4

collect TaskInfo(id=5, priority=79635) count:6/20 main

7603 10306 10775 19711 24922 26445 28371 42919 45293 47049 48024 68107 71741 77275 79166

最大优先级任务:TaskInfo(id=6, priority=79166)

load start TaskInfo(id=6, priority=79166) @time=1766038942123 my-thread-2

load end TaskInfo(id=6, priority=79166) @time=1766038942229 my-thread-3

collect TaskInfo(id=6, priority=79166) count:7/20 main

7603 10306 10775 19711 24922 26445 28371 42919 45293 47049 48024 68107 71741 77275

最大优先级任务:TaskInfo(id=18, priority=77275)

load start TaskInfo(id=18, priority=77275) @time=1766038942230 my-thread-1

load end TaskInfo(id=18, priority=77275) @time=1766038942337 my-thread-4

collect TaskInfo(id=7, priority=10775) count:8/20 main

7603 10306 10775 19711 24922 26445 28371 42919 45293 47049 48024 68107 71741

最大优先级任务:TaskInfo(id=19, priority=71741)

load start TaskInfo(id=19, priority=71741) @time=1766038942338 my-thread-2

load end TaskInfo(id=19, priority=71741) @time=1766038942447 my-thread-3

collect TaskInfo(id=8, priority=89017) count:9/20 main

7603 10306 10775 19711 24922 26445 28371 42919 45293 47049 48024 68107

最大优先级任务:TaskInfo(id=14, priority=68107)

load start TaskInfo(id=14, priority=68107) @time=1766038942447 my-thread-1

load end TaskInfo(id=14, priority=68107) @time=1766038942554 my-thread-4

collect TaskInfo(id=9, priority=85067) count:10/20 main

7603 10306 10775 19711 24922 26445 28371 42919 45293 47049 48024

最大优先级任务:TaskInfo(id=10, priority=48024)

load start TaskInfo(id=10, priority=48024) @time=1766038942555 my-thread-2

load end TaskInfo(id=10, priority=48024) @time=1766038942661 my-thread-3

collect TaskInfo(id=10, priority=48024) count:11/20 main

7603 10306 10775 19711 24922 26445 28371 42919 45293 47049

最大优先级任务:TaskInfo(id=12, priority=47049)

load start TaskInfo(id=12, priority=47049) @time=1766038942662 my-thread-1

load end TaskInfo(id=12, priority=47049) @time=1766038942769 my-thread-4

collect TaskInfo(id=11, priority=79413) count:12/20 main

7603 10306 10775 19711 24922 26445 28371 42919 45293

最大优先级任务:TaskInfo(id=13, priority=45293)

load start TaskInfo(id=13, priority=45293) @time=1766038942770 my-thread-2

load end TaskInfo(id=13, priority=45293) @time=1766038942876 my-thread-3

collect TaskInfo(id=12, priority=47049) count:13/20 main

7603 10306 10775 19711 24922 26445 28371 42919

最大优先级任务:TaskInfo(id=17, priority=42919)

load start TaskInfo(id=17, priority=42919) @time=1766038942877 my-thread-1

load end TaskInfo(id=17, priority=42919) @time=1766038942984 my-thread-4

collect TaskInfo(id=13, priority=45293) count:14/20 main

7603 10306 10775 19711 24922 26445 28371

最大优先级任务:TaskInfo(id=15, priority=28371)

load start TaskInfo(id=15, priority=28371) @time=1766038942985 my-thread-2

load end TaskInfo(id=15, priority=28371) @time=1766038943092 my-thread-3

collect TaskInfo(id=14, priority=68107) count:15/20 main

7603 10306 10775 19711 24922 26445

最大优先级任务:TaskInfo(id=4, priority=26445)

load start TaskInfo(id=4, priority=26445) @time=1766038943092 my-thread-1

load end TaskInfo(id=4, priority=26445) @time=1766038943202 my-thread-1

collect TaskInfo(id=15, priority=28371) count:16/20 main

7603 10306 10775 19711 24922

最大优先级任务:TaskInfo(id=3, priority=24922)

load start TaskInfo(id=3, priority=24922) @time=1766038943203 my-thread-2

load end TaskInfo(id=3, priority=24922) @time=1766038943311 my-thread-3

collect TaskInfo(id=16, priority=7603) count:17/20 main

7603 10306 10775 19711

最大优先级任务:TaskInfo(id=0, priority=19711)

load start TaskInfo(id=0, priority=19711) @time=1766038943312 my-thread-4

load end TaskInfo(id=0, priority=19711) @time=1766038943420 my-thread-1

collect TaskInfo(id=17, priority=42919) count:18/20 main

7603 10306 10775

最大优先级任务:TaskInfo(id=7, priority=10775)

load start TaskInfo(id=7, priority=10775) @time=1766038943421 my-thread-2

load end TaskInfo(id=7, priority=10775) @time=1766038943527 my-thread-2

collect TaskInfo(id=18, priority=77275) count:19/20 main

7603 10306

最大优先级任务:TaskInfo(id=1, priority=10306)

load start TaskInfo(id=1, priority=10306) @time=1766038943528 my-thread-4

load end TaskInfo(id=1, priority=10306) @time=1766038943638 my-thread-4

collect TaskInfo(id=19, priority=71741) count:20/20 main

7603

最大优先级任务:TaskInfo(id=16, priority=7603)

load start TaskInfo(id=16, priority=7603) @time=1766038943638 my-thread-3

load end TaskInfo(id=16, priority=7603) @time=1766038943746 my-thread-3

相关:

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

相关推荐
alexhilton4 小时前
Compose中的ContentScale:终极可视化指南
android·kotlin·android jetpack
jzlhll1235 小时前
kotlin Flow first() last()总结
开发语言·前端·kotlin
符哥20089 小时前
充电桩 WiFi 局域网配网(Android/Kotlin)流程、指令及实例说明文档
android·开发语言·kotlin
大傻^13 小时前
SpringAI2.0 Null Safety 实战:JSpecify 注解体系与 Kotlin 互操作
android·开发语言·人工智能·kotlin·springai
jzlhll12317 小时前
Kotlin Mutex vs Java ReentrantLock vs synchronized
java·开发语言·kotlin
Kapaseker18 小时前
一杯 Kotlin 美式品味 object 声明
android·kotlin
俩个逗号。。18 小时前
Kotlin 扩展函数详解
开发语言·kotlin
su1ka1112 天前
Kotlin(3)基本语法
kotlin
su1ka1112 天前
Kotlin(4)面向对象
kotlin
鹧鸪晏2 天前
搞懂 kotlin 泛型 out 和 in 关键字
android·kotlin