专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
ImportNew  ·  亚马逊程序员破防:AI ... ·  昨天  
芋道源码  ·  项目终于用上了 Spring 状态机,太优雅了! ·  2 天前  
51好读  ›  专栏  ›  ImportNew

关于 Java 面试,你应该准备这些知识点

ImportNew  · 公众号  · Java  · 2017-03-18 20:29

正文

请到「今天看啥」查看全文



面试官 :你说这个项目中用到了netty,能大概讲讲netty的线程模型么?


:(幸好我看过netty的源码)netty通过Reactor模型基于多路复用器接收并处理用户请求(能讲就多讲一点),内部实现了两个线程池,boss线程池和work线程池,其中boss线程池的线程负责处理请求的accept事件,当接收到accept事件的请求时,把对应的socket封装到一个NioSocketChannel中,并交给work线程池,其中work线程池负责请求的read和write事件(通过口述加画图的方式,把请求的执行过程大概描述了一遍,时间有限,也不可能把所有的细节都说完,挑重点讲,挑记忆深刻的讲)


面试官 :嗯,理解的还挺深入的…那你在做这个项目时有没有遇到什么困难,或者是觉得有挑战的地方?


:(这时面试官想让你自己出题自己回答了,所以一定要回答,不回答就突显不出你这个项目了,要是这个问题没有准备过,只能临时发挥了,当然我就是属于临时发挥的)稍微想一下,因为之前确实碰到了这个问题,当时做这个项目时,对netty的不过熟悉,把请求的业务逻辑放在work线程池的线程中进行处理,进行压测的时候,发现qps总是上不去,后来看了源码之后才发现,由于业务逻辑的处理比较耗时,完全占用了work线程池的资源,导致新的请求一直处于等待状态。


面试官 :那最后是如何解决的?


:最后把处理业务的逻辑封装成一个task提交给一个新建的业务线程池中执行,执行完之后由work线程池执行请求的write事件。


面试官 :好的,你知道nio中selector可能触发bug么?


:嗯,对的,selector的select方法,因为底层的epoll函数可能会发生空转,从而导致cpu100%。


面试官 :那如何解决该问题?


:这个问题在netty已经解决了,通过&^%&$^(把netty的解决方案说一遍)


面试官 :嗯,对了,你们这个项目有给自己定指标么?


:有的,&&…………¥¥##@,把自己项目的指标说了一通,如何进行AB实验,如何迭代优化指标


面试官 :嗯,好的 ,项目的问题先到这里,我们来考察一下java的基本点吧。


如上只是本人所做的一个项目,当然了,具体项目具体分析,也不是每个面试官问的点都一样,如果面试官不懂netty,自然会挑别的问题进行提问,不过你也可以尝试着把问题往自己熟悉的方向去靠。


面试知识点


1、线程池


线程池的实现原理,这个知识点真的很重要,几乎每次面试都会被问到,一般的提问方式有如下几种:


  • “讲讲线程池的实现原理”

  • “线程池中的coreNum和maxNum有什么不同”

  • “在不同的业务场景中,线程池参数如何设置”


场景对话:


面试官 :平时线程池用的多么?


:嗯,我的*项目中就用到了


面试官 :那好,你讲讲线程池的实现原理


:(还好我之前看过源码,但是时间久远有点模糊了),能给我笔和纸么,我画图分析给你看看,&&¥&假设初始化一个线程池,核心线程数是5,最大线程数是10@@@


面试官 :嗯,好的,你继续…


:在纸上画了正方形,这个代表一个线程池,初始化的时候,里面是没有线程的


面试官 :嗯,好的,你继续…


:又画了一个细长的长方形,这个代表阻塞队列,一开始里面也是没有任务的







请到「今天看啥」查看全文