进行java面试,我们需要被问到很多知识点,这其中就包括线程池知识点,并且也是java面试中必问的,为了能够让大家顺利通过java面试,今天我们就给大家分享一些java线程池常见面试题!
1.线程池的工作原理是什么?
当线程池中有任务需要执行时,线程池会判断如果线程数量没有超过核心数量就会新建线程池进行任务执行,如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行;如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务;如果超过了最大线程数,就会执行拒绝执行策略。
2.线程和进程有什么区别?
线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。
3.线程池为什么要使用阻塞队列而不使用非阻塞队列?
阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入wait状态,释放cpu资源。当队列中有任务时才唤醒对应线程从队列中取出消息进行执行。使得在线程不至于一直占用cpu资源。(线程执行完任务后通过循环再次从任务队列中取出任务进行执行,代码片段如下
while (task != null || (task = getTask()) != null) {})。
不用阻塞队列也是可以的,不过实现起来比较麻烦而已,有好用的为啥不用呢?
4.如何向线程池中提交任务?
可以通过execute()或submit()两个方法向线程池提交任务。
execute()方法没有返回值,所以无法判断任务知否被线程池执行成功。
submit()方法返回一个future,那么我们可以通过这个future来判断任务是否执行成功,通过future的get方法来获取返回值。
5.常见的线程池有哪些?他们有什么缺点吗?
newFixedThreadPool,线程数固定的线程池。任务队列用的是 LinkedBlockingQueue,该阻塞队列的最大容量是 int 的最大值,21亿左右,可能会造成 OOM;
newSingleThreadExecutor,只有一个线程的线程池。任务队列也是 LinkedBlockingQueue,可能造成 OOM;
newCachedThreadPool,带缓冲的线程池,线程数量不固定。允许的最大线程数是 int 最大值,所以也可能会 OOM。
6.线程池有哪些拒绝策略?
AbortPolicy:抛出异常;
CallerRunsPolicy:任务回退到调用者;
DiscardOldestPolicy:丢弃掉等待最久的任务;
DiscardPolicy:丢弃掉任务。
Java线程池知识在面试中是必问的,所以建议大家平时可以多看这方面题目,增加记忆力,这样对面试还是有好的!最后大家如果想要了解更多Java面试题知识,敬请关注奇Q工具网。
推荐阅读: