一次java面试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GoSaint/article/details/84345210

        前几天去了一家电商公司去面试,感触颇多。在这里复盘下这次面试经历吧!

一面

1 做个自我介绍吧:

我:balabala......

2 你了解线程池吗?

       对于线程池,可以使用Executor的方式去创建,也可以使用ThreadPoolExecutor直接自定义去创建,但是推荐后者,这样可以更加清楚的明白线程池中每一个参数的含义。下面的代码是ThreadpoolExecutor的构造器。最全的一个,存在7个构造器。

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        
}

       回答当然说了解,接着开始说:那你介绍下线程池的7个参数,以及含义。当时我说了6个,分别是corePoolSize、maximumPoolSize 、keepAliveTime、Unit、threadFactory、handler 。最后一个愣是没有想起来,就是workQueue。这也从另一方面说明我对于线程池实现的原理很模糊。如果我很清楚这个原理的话,那么么工作队列workQuene是绝不可能想不起来的。然后我相应的介绍了下这6个参数的含义,但是对于handler的介绍,尤其是拒绝策略,我只说了一个。这道题如果10分来计的话,应该是勉强及格的水平。好了不说那么多了,复盘下这及格参数的含义吧:

corePoolSize  核心线程池的大小

       corePoolSize表示核心线程池的大小,当创建线程池之后,线程池中刚开始是没有线程的。直到有任务传过来时,线程池中才会开始创建线程执行任务。当创建的线程的数量大于corePoolSize之后,就会被到达的任务放在工作队列中。准确的来说:corePoolSize表示线程池中能够同时运行的线程数量。

maximumPoolSize 线程池中允许创建线程的最大数量
线程总数 = 核心线程数 + 非核心线程数

        这个参数的含义是线程池中所能允许创建线程的最大数量

keepAliveTime 线程池中非核心线程的超时时间。如果在此时间内该线程没有活跃,那么线程就会消亡
如果设置allowCoreThreadTimeOut = true,则会作用于核心线程
TimeUnit unit 是KeepAilve的时间单位

       关于阻塞队列或者工作队列,这里也是面试常问的一个问题,一般面试官问到线程池,都会在这里进行延伸。比如常见的阻塞队列有哪些,都有什么特点。然后问到并发队列你知道吗,都有哪些。笔者就是这次被问到。我回答了ArrayBlockingQueue、LinkedBlockingQueue以及二者的区别。其余的都没有回答上。大家可以看下图关于阻塞队列的体系架构: 

               

       在这里我暂时就不一一介绍这些阻塞队列了。因为我认为需要作为一个新的文章介绍。

ThreadFactory 线程工厂,创建线程的方式,这是一个接口,你new他的时候需要实现他的Thread newThread(Runnable r)方法

RejectedExecutionHandler  拒绝策略。有四种

猜你喜欢

转载自blog.csdn.net/GoSaint/article/details/84345210