java多线程池面试题有哪些?java多线程池面试题分享

线程池是多线程中的重要知识点,作为java程序员一定要掌握,因此不仅会在工作中会应用到,去面试java也会考核哦,所以今天我们就给大家分享一些java多线程池面试题以及答案!

1.线程池有什么作用?

线程池作用就是限制系统中执行线程的数量。

提高效率。创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。

方便管理。可以编写线程池管理代码对池中的线程同一进行管理,比如说启动时有该程序创建100个线程,每当有请求的时候,就分配一个线程去工作,如果刚好并发有101个请求,那多出的这一个请求可以排队等候,避免因无休止的创建线程导致系统崩溃。

2.说说线程池的拒绝策略

当请求任务不断的过来,而系统此时又处理不过来的时候,我们需要采取的策略是拒绝服务。RejectedExecutionHandler接口提供了拒绝任务处理的自定义方法的机会。在ThreadPoolExecutor中已经包含四种处理策略。

AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作。

CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。

DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。

DiscardPolicy策略:该策略默默的丢弃无法处理的任务,不予任何处理。

除了JDK默认提供的四种拒绝策略,我们可以根据自己的业务需求去自定义拒绝策略,自定义的方式很简单,直接实现RejectedExecutionHandler接口即可。

3.线程池如何关闭?

关闭线程池可以调用shutdownNow和shutdown两个方法来实现:

shutdownNow:对正在执行的任务全部发出interrupt(),停止执行,对还未开始执行的任务全部取消,并且返回还没开始的任务列表。

shutdown:当我们调用shutdown后,线程池将不再接受新的任务,但也不会去强制终止已经提交或者正在执行中的任务。

4.线程池的工作原理是什么?

当线程池中的线程数量小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程;

当线程池中的线程数量达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行;

当workQueue已满,且MaximumPoolSize>CorePoolSize时,新提交的任务会创建新的非核心线程执行任务;

当并且队列已满,并且提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理;

当一个线程完成任务时,它会从队列中取下一个任务来执行。

当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲的非核心线程,最终线程池中的线程数量会收缩到corePoolSize的大小.

当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭。

注意:线程池将任务存入工作队列的时候调用的是BlockQueue的非阻塞方法offer(E e),因为工作队列满并不会使提交任务的客户端线程暂停。

这些都是java多线程池经常会问到的题目,如果大家觉得好的话,可以将这些收藏起来,在空闲的时候进行消化即可。最后大家如果想要了解更多java面试题知识,敬请关注奇Q工具网。

推荐阅读:

java中继承和聚合的区别是什么?java继承有哪些特征?

json格式文件怎么下载的?json文件如何打开?

java数组底层原理是什么?Java底层之ArrayList底层实现原理