织梦网站地图模板,阿里云域名查询,中小企业是用什么来做网站的开发的,上海建智建设人才培训中心网站Kotlin协程flow缓冲buffer任务流#xff0c;批次任务中选取优先级最高任务率先运行#xff08;一#xff09; 假设现在有一种场景#xff0c;在一个任务接收器中#xff0c;源源不断且不知道任务发送者何时会将新任务发送过来#xff0c;每个任务都具备不同的任务优先级批次任务中选取优先级最高任务率先运行一假设现在有一种场景在一个任务接收器中源源不断且不知道任务发送者何时会将新任务发送过来每个任务都具备不同的任务优先级任务无时无刻的进入任务缓冲池目的是把任务缓冲池中优先级最高的那个任务挑选出来最先运行。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 fun main() { val myThreadPool newFixedThreadPoolContext(4, my-thread) val bufferCapacity 5 val totalTaskSize 15 val channel ChannelTaskInfo() val taskList mutableListOfTaskInfo() runBlocking { //接收任务 async { channel.receiveAsFlow() .buffer(bufferCapacity) .onEach { it - //生产者 println(onEach $it at time${System.currentTimeMillis()} ${Thread.currentThread().name}) taskList.add(it) }.flowOn(myThreadPool) .collect { it - //消费者 println(collect $it at time${System.currentTimeMillis()} ${Thread.currentThread().name}) val newOrderList taskList.sortedBy { it.priority } newOrderList.forEach { print(${it.priority} ) } val lastTaskInfo newOrderList.lastOrNull() println(\n最大优先级任务:$lastTaskInfo) taskList.remove(lastTaskInfo) loader(lastTaskInfo!!) } } //源源不断的密集发送加载任务。 async { repeat(totalTaskSize) { it - enqueue(channel, it) } } } } private suspend fun enqueue(channel: ChannelTaskInfo, id: Int) { val taskInfo TaskInfo(id, (Math.random() * 9999).toInt()) println(enqueue $taskInfo) channel.send(taskInfo) } //假设这里是真正的耗时任务执行体 private suspend fun loader(info: TaskInfo) { println(load start $info time${System.currentTimeMillis()} ${Thread.currentThread().name}) delay(500) println(load end $info time${System.currentTimeMillis()} ${Thread.currentThread().name}) } private class TaskInfo { var id 0 var priority 0 private val taskId 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(id0, priority7947)enqueue TaskInfo(id1, priority1045)enqueue TaskInfo(id2, priority4478)onEach TaskInfo(id0, priority7947) at time1765979341859 my-thread-2onEach TaskInfo(id1, priority1045) at time1765979341859 my-thread-2onEach TaskInfo(id2, priority4478) at time1765979341859 my-thread-2enqueue TaskInfo(id3, priority5964)enqueue TaskInfo(id4, priority2658)onEach TaskInfo(id3, priority5964) at time1765979341859 my-thread-4onEach TaskInfo(id4, priority2658) at time1765979341859 my-thread-4enqueue TaskInfo(id5, priority3495)onEach TaskInfo(id5, priority3495) at time1765979341860 my-thread-3enqueue TaskInfo(id6, priority1461)onEach TaskInfo(id6, priority1461) at time1765979341860 my-thread-4enqueue TaskInfo(id7, priority4860)onEach TaskInfo(id7, priority4860) at time1765979341860 my-thread-3enqueue TaskInfo(id8, priority7226)onEach TaskInfo(id8, priority7226) at time1765979341860 my-thread-4enqueue TaskInfo(id9, priority1939)enqueue TaskInfo(id10, priority133)onEach TaskInfo(id9, priority1939) at time1765979341861 my-thread-3onEach TaskInfo(id10, priority133) at time1765979341861 my-thread-3enqueue TaskInfo(id11, priority1818)enqueue TaskInfo(id12, priority7695)onEach TaskInfo(id11, priority1818) at time1765979341861 my-thread-2onEach TaskInfo(id12, priority7695) at time1765979341861 my-thread-2enqueue TaskInfo(id13, priority4365)onEach TaskInfo(id13, priority4365) at time1765979341862 my-thread-4enqueue TaskInfo(id14, priority4889)onEach TaskInfo(id14, priority4889) at time1765979341862 my-thread-2collect TaskInfo(id0, priority7947) at time1765979341862 main133 1045 1461 1818 1939 2658 3495 4365 4478 4860 4889 5964 7226 7695 7947最大优先级任务:TaskInfo(id0, priority7947)load start TaskInfo(id0, priority7947) time1765979341887 mainload end TaskInfo(id0, priority7947) time1765979342391 maincollect TaskInfo(id1, priority1045) at time1765979342392 main133 1045 1461 1818 1939 2658 3495 4365 4478 4860 4889 5964 7226 7695最大优先级任务:TaskInfo(id12, priority7695)load start TaskInfo(id12, priority7695) time1765979342392 mainload end TaskInfo(id12, priority7695) time1765979342901 maincollect TaskInfo(id2, priority4478) at time1765979342901 main133 1045 1461 1818 1939 2658 3495 4365 4478 4860 4889 5964 7226最大优先级任务:TaskInfo(id8, priority7226)load start TaskInfo(id8, priority7226) time1765979342902 mainload end TaskInfo(id8, priority7226) time1765979343412 maincollect TaskInfo(id3, priority5964) at time1765979343412 main133 1045 1461 1818 1939 2658 3495 4365 4478 4860 4889 5964最大优先级任务:TaskInfo(id3, priority5964)load start TaskInfo(id3, priority5964) time1765979343412 mainload end TaskInfo(id3, priority5964) time1765979343922 maincollect TaskInfo(id4, priority2658) at time1765979343922 main133 1045 1461 1818 1939 2658 3495 4365 4478 4860 4889最大优先级任务:TaskInfo(id14, priority4889)load start TaskInfo(id14, priority4889) time1765979343923 mainload end TaskInfo(id14, priority4889) time1765979344433 maincollect TaskInfo(id5, priority3495) at time1765979344433 main133 1045 1461 1818 1939 2658 3495 4365 4478 4860最大优先级任务:TaskInfo(id7, priority4860)load start TaskInfo(id7, priority4860) time1765979344434 mainload end TaskInfo(id7, priority4860) time1765979344943 maincollect TaskInfo(id6, priority1461) at time1765979344943 main133 1045 1461 1818 1939 2658 3495 4365 4478最大优先级任务:TaskInfo(id2, priority4478)load start TaskInfo(id2, priority4478) time1765979344943 mainload end TaskInfo(id2, priority4478) time1765979345452 maincollect TaskInfo(id7, priority4860) at time1765979345452 main133 1045 1461 1818 1939 2658 3495 4365最大优先级任务:TaskInfo(id13, priority4365)load start TaskInfo(id13, priority4365) time1765979345452 mainload end TaskInfo(id13, priority4365) time1765979345960 maincollect TaskInfo(id8, priority7226) at time1765979345960 main133 1045 1461 1818 1939 2658 3495最大优先级任务:TaskInfo(id5, priority3495)load start TaskInfo(id5, priority3495) time1765979345960 mainload end TaskInfo(id5, priority3495) time1765979346467 maincollect TaskInfo(id9, priority1939) at time1765979346467 main133 1045 1461 1818 1939 2658最大优先级任务:TaskInfo(id4, priority2658)load start TaskInfo(id4, priority2658) time1765979346467 mainload end TaskInfo(id4, priority2658) time1765979346973 maincollect TaskInfo(id10, priority133) at time1765979346973 main133 1045 1461 1818 1939最大优先级任务:TaskInfo(id9, priority1939)load start TaskInfo(id9, priority1939) time1765979346974 mainload end TaskInfo(id9, priority1939) time1765979347482 maincollect TaskInfo(id11, priority1818) at time1765979347482 main133 1045 1461 1818最大优先级任务:TaskInfo(id11, priority1818)load start TaskInfo(id11, priority1818) time1765979347483 mainload end TaskInfo(id11, priority1818) time1765979347986 maincollect TaskInfo(id12, priority7695) at time1765979347986 main133 1045 1461最大优先级任务:TaskInfo(id6, priority1461)load start TaskInfo(id6, priority1461) time1765979347987 mainload end TaskInfo(id6, priority1461) time1765979348498 maincollect TaskInfo(id13, priority4365) at time1765979348498 main133 1045最大优先级任务:TaskInfo(id1, priority1045)load start TaskInfo(id1, priority1045) time1765979348498 mainload end TaskInfo(id1, priority1045) time1765979349006 maincollect TaskInfo(id14, priority4889) at time1765979349006 main133最大优先级任务:TaskInfo(id10, priority133)load start TaskInfo(id10, priority133) time1765979349007 mainload end TaskInfo(id10, priority133) time1765979349513 main相关https://blog.csdn.net/zhangphil/article/details/154843029