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

相关推荐
IT乐手5 小时前
在 Kotlin 中创建 DSL
kotlin
蓬松的毛球9 小时前
kotlin 协程原理分析 - StateFlow 和 SharedFlow 原理
kotlin
常利兵10 小时前
Kotlin Flow 从入门到实战:异步数据流处理的终极解决方案
android·kotlin
Kapaseker10 小时前
数据传参明妙理 临危受命逢转机
android·kotlin
ULTRA??11 小时前
基于range的函数式编程C++,python比较
c++·python·kotlin·c++20
6666v61 天前
Android Kotlin(2) 协程上下文与异常处理机制
kotlin
zhangphil1 天前
Kotlin协程await与join挂起函数异同
kotlin
儿歌八万首1 天前
Android 自定义 View 实战:打造一个跟随滑动的丝滑指示器
android·kotlin
4Forsee1 天前
【Kotlin】Kotlin 基础语法:变量、控制和函数
kotlin