关注
// 获取线程池中的有效线程数量
int wc = workerCountOf(c);
// 如果开发者主动开启allowCoreThreadTimeOut并且获取当前工作线程大于corePoolSize,那么该线程是可以被超时回收的
// allowCoreThreadTimeOut默认为false,即默认不允许核心线程超时回收
// 这里也说明了在核心线程以外的线程都为“临时”线程,随时会被线程池回收
boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;//当前线程数大于核心线程数
// 这里说明了两点销毁线程的条件:
// 1.原则上线程池数量不可能大于maximumPoolSize,但可能会出现并发时操作了setMaximumPoolSize方法,如果此时将最大线程数量调少了,很可能会出现当前工作线程大于最大线程的情况,这时就需要线程超时回收,以维持线程池最大线程小于maximumPoolSize,
// 2.timed && timedOut 如果为true,表示当前操作需要进行超时控制,这里的timedOut为true,说明该线程已经从workQueue.poll()方法超时了,
// 以上两点满足其一,都可以触发线程超时回收
if ((wc > maximumPoolSize || (timed && timedOut))
&& (wc > 1 || workQueue.isEmpty())) {
// 尝试用AQS将线程池线程数量减一
if (compareAndDecrementWorkerCount(c))
// 减一成功后返回null,线程被回收
return null;
// 否则循环重试
continue;
}
try {
// 如果timed为true,阻塞超时获取任务,否则阻塞获取任务
Runnable r = timed ?
workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
workQueue.take();
if (r != null)
return r;
// 如果poll超时获取任务超时了, 将timeOut设置为true
// 继续循环执行,如果碰巧开发者开启了allowCoreThreadTimeOut,那么该线程就满足超时回收了
timedOut = true;
} catch (InterruptedException retry) {
timedOut = false;
}
难道面试官的意思是,超过了规定的时间还要进行等待一段时间在进行回收,而不是马上?
查看原帖
点赞 评论
相关推荐
02-02 11:43
西安邮电大学 前端工程师 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 牛客吐槽大会 #
25611次浏览 324人参与
# 工作前VS工作后,你的心态变化 #
38520次浏览 267人参与
# 秋招想进国企该如何准备 #
125454次浏览 617人参与
# 你的mentor是什么样的人? #
51603次浏览 741人参与
# 从mentor身上学到了__ #
55627次浏览 886人参与
# 我和mentor的爱恨情仇 #
106706次浏览 969人参与
# 我的省钱小妙招 #
37600次浏览 446人参与
# 机械人避雷的岗位/公司 #
44873次浏览 320人参与
# 在大厂上班是一种什么样的体验 #
15248次浏览 224人参与
# 为了减少AI幻觉,你注入过哪些设定? #
7656次浏览 216人参与
# 职场上哪些行为很加分? #
323180次浏览 3619人参与
# 通信/硬件求职避坑tips #
139985次浏览 1087人参与
# 论秋招对个人心气的改变 #
16224次浏览 251人参与
# 你觉得mentor喜欢什么样的实习生 #
48763次浏览 1002人参与
# 你现在会用到哪些AI技能? #
24843次浏览 137人参与
# 牛客AI体验站 #
9438次浏览 230人参与
# 毕业论文进行时 #
27699次浏览 153人参与
# 运营来爆料 #
77452次浏览 467人参与
# 程序员找工作至少要刷多少题? #
24347次浏览 315人参与
# 过年最难忘的一件事 #
23336次浏览 179人参与
美的集团公司福利 878人发布