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
相关: