关注
// 获取线程池中的有效线程数量
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;
}
难道面试官的意思是,超过了规定的时间还要进行等待一段时间在进行回收,而不是马上?
查看原帖
点赞 评论
牛客热帖
更多
正在热议
更多
# 我的求职总结 #
12309次浏览 225人参与
# 辞职之后最想做的一件事 #
7985次浏览 87人参与
# 毕业季,给职场新人一些建议 #
11661次浏览 217人参与
# 选offer应该考虑哪些因素 #
9887次浏览 135人参与
# 我的实习日记 #
2417553次浏览 25273人参与
# 工作后会跟朋友渐行渐远吗 #
20516次浏览 159人参与
# 你小时候最想从事什么职业 #
90122次浏览 1690人参与
# 你想留在一线还是回老家? #
36349次浏览 439人参与
# 薪资爆料 #
102017次浏览 1039人参与
# 毕业后不工作的日子里我在做什么 #
167761次浏览 1484人参与
# 设计人如何选offer #
108026次浏览 707人参与
# 生物制药/化工校招攻略 #
42634次浏览 282人参与
# 比亚迪求职进展汇总 #
703385次浏览 3060人参与
# 第一份工作应该只看薪资吗 #
136871次浏览 1438人参与
# 你们公司哪个部门最累? #
14377次浏览 123人参与
# 你们的毕业论文什么进度了 #
1013976次浏览 9513人参与
# 秋招想进国企该如何准备 #
56673次浏览 363人参与
# 招聘要求与实际实习内容不符怎么办 #
98176次浏览 718人参与
# 工作中的卑微时刻 #
8771次浏览 54人参与
# 大学最后一个寒假,我想…… #
35468次浏览 454人参与