柏楚电子 Java 终面面经
- 轮次
- 终面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- 问最近实习内容,深挖技术栈,完全拷打(这一部分将近四十分钟)。
- 线程池核心参数。
- 反问。
《参考解析》
终面的实习深挖怎么准备。这场面试四十分钟都花在实习上,说明面试官在验真:他关心的是「这些技术选型是不是你做的、你当时知不知道为什么这么做」。准备时可以按项目画一张自己的攻防图,对每个技术点自问五个问题:为什么用这个(备选方案是什么、为什么淘汰)、关键参数是多少(凭什么是这个值)、边界在哪(量级涨十倍会怎样、哪里先崩)、出过什么故障(现象、定位过程、修复与防复发)、如果重做会怎么改。特别要把简历上每一个技术名词都当成会被追问的:写了 Redis 就要能讲清数据结构选型、过期策略、持久化与集群模式;写了 MQ 就要能讲消息丢失、重复消费、顺序性与积压处理;写了分库分表就要能讲分片键选择、跨片查询、扩容方案。简历上没有的别写,写了的必须能扛住三层追问。
被问到不会的地方,正确的处理不是硬编,而是划边界:「这块是我们组的另一位同事负责的,我了解到的程度是……我的部分是这样做的」或者「这个参数是压测出来的,当时测过 A、B 两档,具体数值我记不太准,但结论是……」。终面的面试官往往是团队负责人或更高级别,他们对「知识的边界感」比对「什么都懂」更看重,硬撑一次被拆穿,前面四十分钟的信任就没了。
线程池核心参数。ThreadPoolExecutor 的七个参数是 corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime 与 unit(非核心线程空闲存活时间)、workQueue(任务队列)、threadFactory(线程工厂)、handler(拒绝策略)。任务提交的执行顺序必须背准:先看核心线程是否已满,未满就新建核心线程执行;核心满了把任务放进队列;队列满了才创建非核心线程直到最大线程数;再满就交给拒绝策略。
几个高频追问的答案要点:① 为什么先入队再扩容——线程池的设计目标是复用和削峰,队列是缓冲,但这导致用无界队列(如默认的 LinkedBlockingQueue)时 maximumPoolSize 永远不生效,任务无限堆积最终 OOM,所以生产上必须给队列设容量。② 拒绝策略怎么选——AbortPolicy(默认)抛 RejectedExecutionException,适合不能丢的任务;CallerRunsPolicy 让提交任务的线程自己执行,形成天然反压,是异步日志、批处理场景的常用选择;DiscardPolicy 与 DiscardOldestPolicy 静默丢弃,只在明确能容忍丢失时用,而且一定要打日志,否则问题会被藏起来。③ 线程数怎么定——CPU 密集型约 核数 + 1,IO 密集型按 核数 × (1 + 等待时间 / 计算时间) 估算,最终以压测和监控为准;监控要看活跃线程数、队列长度、拒绝次数和任务耗时。④ 工程上要注意的坑——用 ThreadFactory 给线程起名字便于排查;多个业务必须用不同的池做隔离,别共用一个公共池;父子任务共用一个池并且父任务等待子任务结果会死锁;应用关闭时要 shutdown + awaitTermination 优雅停机,别把在途任务丢掉;Spring 里用 ThreadPoolTaskExecutor 时注意核心参数与队列容量的默认值,很多线上事故就是用了默认的无界队列。
自我介绍。终面的自我介绍要和初面不同:技术细节压缩,重点放在「我是谁、做过什么、为什么适合这个团队、我想做什么」。三十秒到一分半,结构是:学校/专业与核心方向 → 最有代表性的两段经历(一段实习 + 一个项目,各自一句结果)→ 与岗位的匹配点 → 期望。别复述简历,也别从大学社团讲起。
反问环节。终面反问是最后一次展示判断力的机会,问「团队现在最头疼的技术问题是什么」「这个岗位前三个月最重要的产出是什么」「代码评审和质量把控是怎么做的」「团队的稳定性/线上事故处理流程是怎样的」这类问题,比问薪资和加班更有信息量,也更能让对方觉得你是来干活的。薪资、到岗时间这类问题如果面试官没主动问,可以放在拿到 offer 之后的沟通里,不必占用终面时间。