HiExecutor里面的PriorityBlockingQueue是并发无界阻塞优先级队列,将导致非核心线程没有执行机会

HiExecutor里面的PriorityBlockingQueue是并发无界阻塞优先级队列,将导致非核心线程没有执行机会

# 具体遇到的问题
HiExecutor里面的PriorityBlockingQueue是并发无界阻塞优先级队列,将导致非核心线程没有执行机会,是否有别的办法改进
# 报错信息的截图
# 相关课程内容截图
http://img1.sycdn.imooc.com//climg/5f8ea25f09151f0116660725.jpg# 尝试过的解决思路和结果

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

在这里输入代码,可通过选择【代码语言】突出显示

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
提问者 慕虎1567721 2020-10-23 09:22:25
LovelyChubby 2020-10-20 21:47:35

线程池的调度策略就是 优先让核心线程去执行任务,核心线程打满了,那么会创建非核心线程执行任务。

你说的非核心线程没机会执行任务,这个不是问题吧?

  • 提问者 慕虎1567721 #1
    线程池的工作机制 1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步骤需要获取全局锁)。 2)如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue。 3)如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务。 4)如果创建新线程将使当前运行的线程超出maximumPoolSize,任务将被拒绝,并调用RejectedExecutionHandler.rejectedExecution()方法。 按照上述顺序,因为priorityBlockingQueue是无界的,所以永远不会创建非核心线程。即您定义的HiExecutor最多只会有cpuCount+1条线程运行
    2020-10-22 20:47:22
  • LovelyChubby 回复 提问者 慕虎1567721 #2
    这么说是,可以换成linkedblockedqueue。这个有界队列,runnable任务添加进去的时候排下序
    2020-10-23 12:45:07
  • 提问者 慕虎1567721 回复 LovelyChubby #3
    但是用LinkedBolckedQueue如何实现线程按优先级排序呢?
    2020-10-26 13:45:00
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师