本文共 983 字,大约阅读时间需要 3 分钟。
线程池场景
面试官:“假设我们有一个线程池,核心线程数为10,最大线程数也为20,任务队列为100。现在来了100个任务,线程池里现在有几个线程运行?”粉丝豪:“应该是10吧。”
面试官:“你确定?”
粉丝豪:“确定啊,就是10…”
于是乎,粉丝豪就回去等通知了~
此题的陷阱,大家如果看出来了,本文就不用看了!
其实这道题正确的答案是"不一定!"因为并没指明是哪一种线程池机制,带着我们的疑问继续往下看!
正文
查看一下ThreadPoolExecutor的execute方法 在这里插入图片描述解释
判断当前活跃线程数是否小于corePoolSize,如果小于,则调用addWorker创建线程执行任务 如果不小于corePoolSize,则将任务添加到workQueue队列 如果放入workQueue失败,则创建线程执行任务,如果这时创建线程失败(当前线程数不小于maximumPoolSize时),就会调用reject(内部调用handler)拒绝接受任务。 在这里插入图片描述 如图所示,默认的机制为线程池里的核心线程数不够了,后面进来的任务会先丢队列,当队列满了,才起新线程。 但是,有一种线程池机制的是这样的先起线程,到最大值,再进队列
在dubbo中,有一种线程池叫EagerThreadPoolExecutor线程池。 在这里插入图片描述 它调的还是父类的execute方法,也还是ThreadPoolExecutor中的execute方法!但是,它的队列!是一种自定义队列,叫TaskQueue,它的offer方法如下
在这里插入图片描述 这个offer方法的最核心的是红框中那步,当前线程数小于最大线程数时,则直接返回false。ThreadPoolExecutor中的execute方法中的第二步的条件中,如果workQueue.offer返回为fasle,则直接进入第三步,创建新任务!如下图所示
在这里插入图片描述 EagerThreadPoolExecutor线程池通过自定义队列的这么一种形式,改写了线程池的机制。这种线程池的机制是核心线程数不够了,先起线程,当线程达到最大值后,后面的任务就丢进队列! https://blog.csdn.net/Mr_25kjiang/article/details/105815054