我提问:
问题描述 下面是一个有关线程池调度的面试真题,来自于疯狂创客圈社群: 一个线程池的核心线程数为10个,最大线程数为20个,阻塞队列的容量为30。现在提交45个 任务,每个任务的耗时为500毫秒。 请问:这批任务执行完成总计需要多少时间?注:忽略线程创建、调度的耗时。
“豆包”第一次答案概略:
首先,前 10 个任务会立即被核心线程执行,耗时 500 毫秒×10 = 5 秒。
然后,接下来的 10 个任务会创建新线程执行(达到最大线程数),耗时也是 5 秒。
此时已经执行了 20 个任务,还剩下 45 - 20 = 25 个任务。
这 25 个任务会进入阻塞队列,阻塞队列容量为 30,还能容纳。
当 20 个线程执行完各自的任务(耗时 5 秒)后,再从阻塞队列中取出任务执行,取完阻塞队列中的 25 个任务需要 25×500 毫秒 = 12.5 秒。
所以这批任务执行完成总共需要 5 秒 + 5 秒 + 12.5 秒 = 22.5 秒。
我提问:从阻塞队列取任务是单线程吗?
“豆包”第二次回答
从阻塞队列取任务不一定是单线程。
在一般的线程池实现中,多个工作线程都可以从阻塞队列中获取任务来执行,而不是局限于单个线程。这样可以提高任务处理的效率和并发性。
但具体情况可能因线程池的具体实现和配置而有所不同。
我提问:所以上题面试题的答案是否有不对之处?
“豆包”第三次回答
非常抱歉,我之前的分析不够全面。
当