关注
// 获取线程池中的有效线程数量
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;
}
难道面试官的意思是,超过了规定的时间还要进行等待一段时间在进行回收,而不是马上?
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 一觉醒来,穿越回国庆前 #
3152次浏览 19人参与
# 你找工作的时候用AI吗? #
148527次浏览 806人参与
# 深信服秋招来了 #
274257次浏览 2905人参与
# 机械制造公司评价 #
142608次浏览 324人参与
# 如果没找到工作,考公是你的退路吗 #
51642次浏览 411人参与
# 面试等了一周没回复,还有戏吗 #
154700次浏览 1306人参与
# 携程求职进展汇总 #
643929次浏览 4671人参与
# 机械人求职现状 #
25605次浏览 274人参与
# 京东美团大战,你怎么看? #
130438次浏览 738人参与
# 金融财经春招备战日记 #
32549次浏览 189人参与
# 虾皮求职进展汇总 #
314673次浏览 2528人参与
# 中广核工作体验 #
19323次浏览 65人参与
# 校招入职后的感受 #
385566次浏览 3288人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
38456次浏览 499人参与
# 工作两年想退休了 #
168488次浏览 1494人参与
# 你有没有为省钱「拼过命」 #
24230次浏览 226人参与
# 央国企投递记录 #
113224次浏览 1456人参与
# 26届的你,投了哪些公司? #
199021次浏览 1263人参与
# 牛油的搬砖plog #
115081次浏览 839人参与
# 非技术岗投递进展 #
156503次浏览 1312人参与
# 通信/硬件公司求职体验 #
146402次浏览 958人参与
# 应届生,你找到工作了吗 #
66986次浏览 452人参与