java线程参数_Java线程池的参数设置
java线程池创建的四种最近⾯试过⼀些候选⼈,⾯试过程中,我⽐较倾向于问⼀些偏基础⼜较为开放的问题,⽤来看看候选⼈基础能⼒怎么样,⽐如线程池,提问过程⼀般类似如下:
我先问候选⼈平时怎么使⽤线程池,得到的结果不出意外就是两种:1.我不⽤线程池,⼯作中没接触过并发;2.⽤
不管是哪⼀种回答,我还是希望能从候选⼈那⾥得到他们对线程池的理解,因此还是会问⼀下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数量的线程永远不会被创建,明显候选⼈是随意设置的,没有经过思考,这个时间我会让他结合前⾯⼀个题再思考思考
这⼀步后,有些等候⼈开始回答出⽤4个线程,队列50,但这样并不是最优的,因为⽇常每秒1个任务时,只需要⼀个线程就够了,创建出4个线程,就有3个浪费
很显然,⽇常只需要⼀个线程,那么corePoolSize=1,⽽⾼峰时候,虽然任务有50个,但是只是4C的机器,对于cpu密集型任务,4个线程是最优的,因此理想情况下maxCorePoolSize=4,最后再看看队列,因为队列满了,max才会被创建,⽽我们需要让max快速被创建出来,⼜不会出现任务拒绝,因此,可将队列⼤⼩设置成46,那么线程池的⾏为如下:
提交第⼀个任务,创建出core,1个线程
提交第⼆个到第47个任务时,这些任务进⼊到队列中,此时队列已满
提交第48个任务到第50个任务时,创建出max,此时⼀共有4个线程
4个线程同时将队列⾥的46个任务消费完
⼀段时间后,max - core数量的线程销毁,即销毁3个线程,还剩下⼀个线程