最近面试面试官都在问一些偏基础又较为开放的问题,用来看看候选人基础能力怎么样,比如线程池,提问过程一般类似如下:。

怎么使用线程池,得到的结果不出意外就是两种:1.我不用线程池,工作中没接触过并发,2.用Executors.newCachedThreadPool。

不管是哪一种回答,我还是希望能从候选人那里得到他们对线程池的理解,因此还是会问一下ThreadPoolExecutorService的几个参数相关的问题,除了基础非常差的候选人外,一般候选人都能回答上corePoolSize,maxPoolSize,BlockingQueue之间的关系:。

corePoolSize是核心线程数,maxPoolSize是最大线程数,BlockingQueue是任务队列。

当有任务提交时,先创建corePoolSize数量的线程,有更多的任务则进入到BlockingQueue,BlockingQueue满了还不够则创建线程数直到macPoolSize。

线程空闲一段时间后会被销毁直到线程池中只剩下core数量的线程。

回答出这几个参数的作用以及他们之间的关系后,我一般会给一到两个线程池相关的题,看看候选人是否能思考出,比如:。

假如提交到线程池中的任务,IO耗时占比是90%,计算耗时占比10%,忽略提交到线程池中的任务数量,在4C8G的机器上,理想情况下线程池中创建多少个线程是最优的。

一般平时只埋头写CURD的候选人,难以计算出来,当然也遇到了不少能算出来结果来的,线程数=(1/0.1)*4=40,能算出来的候选人,我会问下其它问题,例如:。

假如e有一类cpu密集性的任务,没有IO操作,日常的时候只有1个任务,流量高峰会有50个任务,4C8G的机器上,使用的线程池,如何设置corePoolSize,maxPoolSize以及BlockingQueue的大小。

这样的问题,我还没有遇到能回答的候选人,一般得到类似于下的回答:。

corePoolSize=4个线程,maxPoolSize大点100个,队列大点,1万2。

个线程,队列大点1千。

因此我会对候选人做一些引导,比如回答core=4,max=50,queue=1w的,我会问他他设置的maxPoolSize有没有作用,明显队列设置成1w,这个队列太大,根本就不会满,maxPoolSize数量的线程永远不会被创建,明显候选人是随意设置的,没有经过思考,这个时间我会让他结合前面一个题再思考思考。

很显然,日常只需要一个线程,那么corePoolSize=1,而高峰时候,虽然任务有50个,但是只是4C的机器,对于cpu密集型任务,4个线程是最优的,因此理想情况下maxCorePoolSize=4,最后再看看队列,因为队列满了,max才会被创建,而我们需要让max快速被创建出来,又不会出现任务拒绝,因此,可将队列大小设置成46,那么线程池的行为如下:。

提交第一个任务,创建出core,1个线程。

提交第二个到第47个任务时,这些任务进入到队列中,此时队列已满。

提交第48个任务到第50个任务时,创建出max,此时一共有4个线程。

4个线程同时将队列里的46个任务消费完。

一段时间后,max-core数量的线程销毁,即销毁3个线程,还剩下一个线程。

一:入门阶段的学习目标是Java程序员。

Java学习路线,Java程序员需要包括掌握下面这些知识,Java核心编程,如输入输出流,多线程,集合,XML,正则表达式等,熟悉并掌握Java的基础语法,类,抽象类,接口,内部类等概念,熟悉jdk,jvm,eclipse,安装于配置jdk,Java图形化编程,如awt,swing,Java网络编程,Applet,Socket,TCP/IP,NIO等,Java高级特性,如反射,泛型,自动装箱与拆箱等。

二:提高阶段的学习目标是Java初级软件工程师。

轻松学Java开发,Java初级软件工程师需要学会以下知识点,1,JavaWeb核心开发技术,如JavaBean,Servlet,EL等2,网页开发技术,如HTML,CSS,Java,AJAX3,Java与数据库开发技术,如SQL,MySql,Oracle,SQLServer,JDBC。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。