引言
作为一名资深的 Java 摸鱼工程师
又到了一年一度的校招季,老板笑嘻嘻地递来了简历,语重心长地对我说:"给团队注入点新鲜血液!"
我信心满满地打开视频面了这个同学,结果......他直接甩了我一句"老古董",然后啪,把视频挂了。
我:???

面试中
买了一杯星巴克,我坐进了电话亭,看了一下简历
学历不错嘛,985本硕,字节、蚂蚁、阿里实习一圈,还自称"精通多线程、高并发"。我抿了一口咖啡,内心OS:"小伙子挺能吹,看我待会儿怎么用八股文给你上上强度。"
连线中.....
我(职业假笑):"你好,是狂少同学吗?我是xx公司面试官,看你简历写有多线程高并发经验,咱直接从这个开始吧?"
狂少表现的略显紧张:"emmm,好的,老师,您问"
作为一名专业的面试官,面试一定要由浅入深,挖掘面试者最大的潜能,我起手先来一句:"线程池使用过吗?给我讲一下他的基本参数有哪些?"
狂少:"好的,老师,我使用过线程池,我先给您简单介绍一下线程池的基本参数,首先第一个参数是核心线程数 corePoolSize,他是常驻在系统里的,不会被销毁"
"stop,停一下",我心想你小子还是年轻光知道背八股是吧,我直接打断施法,冷笑一声继续说到 "核心线程数一定不会被销毁么?你说错了"
空气突然安静,我心里此时想到,"不愧是我,还得是我经验老道"

狂少补充到:"老师,我的意思是没,一般情况下是不会被销毁的,当然你要是想销毁是可以通过 executor.allowCoreThreadTimeOut(true) 来设置的"
我清了清嗓:"咳咳,对,这个作为程序员我们表达要严谨,你看看我差点误解你了,行,那你继续说说你一般是怎么设置这个线程池的核心线程数的"
狂少回答到:"一般情况下,我们在开始压测前都有一个理想值,然后我们都是根据业务场景来压测获得这个值的"
"啥玩意回答的,这不是我想听的八股",但是作为一名好的面试官,我要学会引导面试者,于是我很耐心的说到"真正干活中哪里来的这么多时间给你压测,直接按照 CPU 密集型是 N+1,IO 密集型是 2N 就行"
狂少这时候皱了一下眉头,我心想:"你这小子还不相信",于是我直接一个电子书发到了他的钉钉上,"同学,我发你一本《Java并发编程》电子版,第八章明明白白写着呢!菜就多练"
这个时候狂少突然被我说的,脸上挂不住,反问了我一句:"老登,Tomcat默认线程数你说是2N吗?为什么是2N?你知不知道它实际怎么设置的?"
我一时以为我听错了,我不是老师么,怎么变成老登了
"为什么设置 2N,书都发给你了不会看,线程数等于 CPU 核心数 * CPU 利用率 * (1 + CPU 等待时间/CPU 计算时间),这个公式下 IO 密集型的 计算时间 = 等待时间,那就是 CPU 核心数 * CPU 利用率 * 2,我设置 2N 一点毛病没有" 我脸红耳赤的争辩到
这时狂少突然提高了音量:"哼,还 2N,你不通过压测你怎么知道适合你的业务场景,我告诉你,我之前接触过的一个场景,我们都是设置 5N 的核心线程数,你那一套早过时了"
我继续争辩到:"你是书包么,这么能装,还 5N ,书上还能写错不成,你 5N 你的线程上下文切换开销你受得了么"
"都 2025 年了,还在 CPU 上下文切换开销,现在的机器上下文切换耗时都只在 1~5 微妙,你告诉我这有什么耗时,这点损耗计较个鸡毛啊,肯定得压测才能得出具体合适的值,老古董,我不面了"
我(试图挽尊):"你别走!我还没......"
嘟------嘟------嘟------
电话亭里,只剩下我,一杯凉透的星巴克 以及空气中循环播放的"老古董......老古董......老古董......"

结尾
(一阵急促的敲门声突然响起)
我没好气的说到:"谁啊?!没看见正在面试呢"
门缓缓打开,只见老板端着两杯热腾腾的拿铁走了进来。老板笑眯眯的说:"面得怎么样?"
我:"别提了,现在年轻人太狂了,说我是老古董..."
老板拍拍了我肩:"知道为什么我特意让你面他吗?"
老板突然压低声音:"那是公司刚挖来的CTO的儿子,专门让他来试试水深的。"
我瞬间石化了:"卧槽?!你不早说?!"
老板这时候给我递过拿铁:"稳住!他刚给我发消息了..."
(手机屏幕亮起)
狂少:你们这面试官有点东西啊,虽然古板但基础挺扎实,就是需要一点变通
我:"!!!!!!"
(手中的拿铁剧烈颤抖)
远处隐隐传来老板的补刀:"他说下周要来给你做专场培训..."