支持内部晋升的无锁并发优先级线程池
支持内部晋升的无锁并发优先级线程池 文章目录 支持内部晋升的无锁并发优先级线程池 引言 推导过程 如何实现优先级晋升 数据结构设计 一个指针产生的问题 任务插入指针和任务读取指针 任务插入指针如何移动 任务插入指针移动到同一位置导致的优先级任务混合问题 任务读取指针如何移动 插入和读取并发 代码实现 任务插入 任务的读取 包装为BlockQueue 效果展现 代码托管地址 引言 在技术群讨论到一个有意思的业务需求,可以描述为: 有一个内部按照优先级进行任务排序的线程池。线程池会优先执行高优先级的任务。随着时间的流逝,线程池内部低优先级的任务的优先级会逐渐晋升变为高优先级,以避免被不断新增的高优先级任务阻塞导致饿死。 考虑到 JDK 已经为开发者提供了自定义线程池 ThreadPoolExecutor 以及优先级队列 PriorityBlockingQueue ,两者相结合并且定期调整队列中低优先级任务的优先级再进行 resort 将低优先级的任务调整到队列的前头,也可以一定程度上避免被饿死。 这种方案的问题在于 resort 的消耗比较高,并且还需要重新计算每一个任务的优先级。为此,引出我们下面的设计,希望使用无锁并发的数据结构存储任务,并且任务支持自动的优先级晋升,保证低优先级的任务最终能够执行而不会被不断增加的高优先级任务饿死。 欢迎加入技术交流群186233599讨论交流