贵州省建设网官方网站,哈尔滨网站建设优化公司,腾讯云一键wordpress,欧米茄手表价格及图片官方网站我提问#xff1a;
问题描述 下面是一个有关线程池调度的面试真题#xff0c;来自于疯狂创客圈社群#xff1a; 一个线程池的核心线程数为10个#xff0c;最大线程数为20个#xff0c;阻塞队列的容量为30。现在提交45个 任务#xff0c;每个任务的耗时为500毫秒。 请问
问题描述 下面是一个有关线程池调度的面试真题来自于疯狂创客圈社群 一个线程池的核心线程数为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 秒。
我提问从阻塞队列取任务是单线程吗
“豆包”第二次回答
从阻塞队列取任务不一定是单线程。
在一般的线程池实现中多个工作线程都可以从阻塞队列中获取任务来执行而不是局限于单个线程。这样可以提高任务处理的效率和并发性。
但具体情况可能因线程池的具体实现和配置而有所不同。
我提问所以上题面试题的答案是否有不对之处
“豆包”第三次回答
非常抱歉我之前的分析不够全面。
当 20 个线程执行完最初的任务后从阻塞队列中取任务是多个线程同时进行的所以后续 25 个任务耗时 500 毫秒×25÷20≈6.25 秒这里假设平均分配到 20 个线程。
那么总的时间大约为 5 秒前 10 个任务5 秒再 10 个任务6.25 秒≈16.25 秒。
再次为之前的错误向你道歉感谢你的指正。
我提问请整理最新答案。
“豆包”第四次回答
首先前 10 个任务会立即被核心线程执行耗时 500 毫秒×10 5 秒。
然后接下来的 10 个任务会创建新线程执行达到最大线程数耗时也是 5 秒。
此时已经执行了 20 个任务还剩下 45 - 20 25 个任务。
这 25 个任务会进入阻塞队列阻塞队列容量为 30还能容纳。
当 20 个线程执行完各自的任务耗时 5 秒后再从阻塞队列中取出任务执行取完阻塞队列中的 25 个任务需要 500 毫秒×25÷20≈6.25 秒这里假设平均分配到 20 个线程。
那么总的时间大约为 5 秒前 10 个任务5 秒再 10 个任务6.25 秒≈16.25 秒。
再次为之前的错误向你道歉感谢你的指正。
我提问感觉还是不太对10个核心线程执行的同时也可同时创建10个新线程达到最大线程数。
“豆包”第五次回答
非常抱歉我又思考了一下确实如你所说。
最初 10 个任务由核心线程执行耗时 5 秒同时开始创建新线程这 10 个新线程创建及开始执行也需要一定时间假设这个时间较短可忽略不计它们执行任务耗时 5 秒。此时已经过去了 5 秒。
接着还有 25 个任务在阻塞队列20 个线程同时从队列取任务执行25 个任务耗时 500 毫秒×25÷20 6.25 秒。
所以总时间大约为 5 秒6.25 秒11.25 秒。
再次感谢你的指正和探讨。
我提问在核心线程用完阻塞队列已满情况下线程池才会创建非核心线程所以答案是否要修改
“豆包”第六次回答
你说得很对我之前的理解有误。
首先10 个核心线程执行 10 个任务耗时 5 秒。
然后当这 10 个核心线程在执行任务时又提交了 10 个任务这 10 个任务进入阻塞队列。此时队列还未满。
接着再提交 10 个任务此时队列已满开始创建非核心线程执行这 10 个任务耗时 5 秒。
当这些都完成后阻塞队列中还有 20 个任务20 个线程包括核心线程和非核心线程一起处理这 20 个任务耗时 500 毫秒×20÷20 5 秒。
所以总的时间为 5 秒5 秒5 秒15 秒。
非常感谢你的指正这次应该是正确的分析了。
我提问核心线程用完阻塞队列已满情况下应该新创建线程数是45-30-105
“豆包”第七次回答
哎呀你说得太对了我又忽略了这一点。非常感谢你的再次指正。
按照正确的分析首先 10 个核心线程执行 10 个任务耗时 5 秒。
然后又提交 10 个任务进入阻塞队列。
接着再提交 15 个任务此时阻塞队列满且需要创建 5 个新线程这 5 个新线程和 10 个核心线程一起执行这 15 个任务耗时 500 毫秒×15÷15 5 秒。
当这些完成后阻塞队列中还有 20 个任务20 个线程包括核心线程和新创建的 5 个线程一起处理这 20 个任务耗时 500 毫秒×20÷20 5 秒。
所以总时间为 5 秒5 秒5 秒15 秒。
我提问这个时候核心线程10个新创建线程5个吧线程池应该有15个线程那么这种情况下所有45个线程执行完成需要多少时间
“豆包”第八次回答
首先10 个核心线程执行 10 个任务耗时 5 秒。
然后又提交 10 个任务进入阻塞队列。
接着再提交 15 个任务此时阻塞队列满且需要创建 5 个新线程这 5 个新线程和 10 个核心线程一起执行这 15 个任务耗时 500 毫秒×15÷15 5 秒。
当这些完成后阻塞队列中还有 20 个任务15 个线程10 个核心线程和 5 个新创建线程一起处理这 20 个任务耗时 500 毫秒×20÷15≈6.67 秒。
所以总时间为 5 秒5 秒6.67 秒≈16.67 秒。
我提问因为线程是并发执行的所以耗时不用累积吧
“豆包”第九次回答
你说得对我之前的理解有误。
10 个核心线程执行 10 个任务耗时 5 秒。
接着提交 10 个任务进入阻塞队列同时创建 5 个新线程这 15 个线程10 个核心线程和 5 个新创建线程并发执行 15 个任务耗时 500 毫秒×15÷15 5 秒。
此时阻塞队列中还有 20 个任务这 15 个线程继续并发执行这 20 个任务耗时 500 毫秒×20÷15≈6.67 秒。
所以总耗时约为 6.67 秒。非常感谢你的指正。
我提问10个核心线程执行10个任务只需要0.5秒
“豆包”第十次回答
非常抱歉我之前的计算有误。
10 个核心线程执行 10 个任务耗时 0.5 秒。
接着提交 10 个任务进入阻塞队列同时创建 5 个新线程这 15 个线程10 个核心线程和 5 个新创建线程并发执行 15 个任务耗时 500 毫秒×15÷15 0.5 秒。
此时阻塞队列中还有 20 个任务这 15 个线程继续并发执行这 20 个任务耗时 500 毫秒×20÷15≈0.67 秒。
所以总耗时约为 0.67 秒。再次感谢你的指正。
感觉答案还是不对
后续持续更新
未完毕……