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

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

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

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.youkuaiyun.com/zhangphil/article/details/156027806

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangphil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值