线程池面试题一般会怎么问?线程池面试题总结及答案整理

线程池面试题一般会怎么问?线程池面试题总结及答案整理对于广大程序员来说,线程池一定不会陌生,因为大部分程序员面试时总会被问到关于线程池的问题,今天总结了一些关于线程池的各种面试可能问到的题目,希望对大家有所帮助。一、线程池是什么?答:线程池,是一种多线程处理形式,在处理过程中将任务添加到队列中,然后在创建线程后自动启动这些任务。比如把线程池看成一个容器,集中管理线程。线程使用完不会销毁,会先储存在线程池中。二、线程池有几种?答:常见的线程池有四种。newCachedThreadPool创建一个可缓存的线程池,如果线程池长度超过处理需要,

大家好,又见面了,我是你们的朋友全栈君。

对于广大程序员来说,线程池一定不会陌生,因为大部分程序员面试时总会被问到关于线程池的问题,今天总结了一些关于线程池的各种面试可能问到的题目,希望对大家有所帮助。

一、线程池是什么?

答:线程池,是一种多线程处理形式,在处理过程中将任务添加到队列中,然后在创建线程后自动启动这些任务。比如把线程池看成一个容器,集中管理线程。线程使用完不会销毁,会先储存在线程池中。

二、线程池有几种?

答:常见的线程池有四种。

  1. newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  2. newFixedThreadPool 创建一个定长线程池,可控制最大并发数,超出的线程将在队列中等待。
  3. newScheduledThreadPool 创建一个定时线程池,支持定时及周期性的执行任务。
  4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有的任务按照指定顺序执行(FIFO,LIFO)。

三、线程池都有什么用?

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

线程池是一种多线程处理形式,处理过程中将任务添加队列,然后在创建线程后自动启动这些任务,每个线程都使用默认的堆栈大小,以默认的优先级运行,并处在多线程单元中,如果某个线程在托管代码中空闲,则线程池将插入另一个辅助线程来使所有处理器保持繁忙。

如果所有线程池都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后辅助线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才能启动。总之就是低消耗,响应速度快,可管理性高。

四、线程池中的几种重要的参数

  1. corePoolSize就是线程池中的核心线程数量,这几个核心线程,只是在没有用的时候,也不会被回收。
  2. maximumPoolSize就是线程池中可以容纳的最大线程的数量。
  3. keepAliveTime,就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间,util,就是计算这个时间的一个单位。
  4. workQueue,就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)。
  5. threadFactory,就是创建线程的线程工厂。
  6. handler,是一种拒绝策略,我们可以在任务满了之后,拒绝执行某些任务。

五、说说线程池的拒绝策略

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

  1. AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作。
  2. CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。
  3. DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。
  4. DiscardPolicy策略:该策略默默的丢弃无法处理的任务,不予任何处理。

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

六、初始化线程池时线程数的选择

如果任务是IO密集型,一般线程数需要设置2倍CPU数以上,以此来尽量利用CPU资源。

如果任务是CPU密集型,一般线程数量只需要设置CPU数加1即可,更多的线程数也只能增加上下文切换,不能增加CPU利用率。

上述只是一个基本思想,如果真的需要精确的控制,还是需要上线以后观察线程池中线程数量跟队列的情况来定。

七、线程池都有哪几种工作队列

  1. ArrayBlockingQueue是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
  2. LinkedBlockingQueue一个基于链表结构的无界阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列。
  3. SynchronousQueue一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
  4. PriorityBlockingQueue一个具有优先级的无限阻塞队列。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137424.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • kotlin使用spring mvc(六)

    kotlin使用spring mvc(六)

    2021年6月15日
    118
  • redission jedis_redis could not get a resource

    redission jedis_redis could not get a resourceJedis操作Redis

    2022年9月9日
    0
  • 什么是JPA_论文题目不能用浅谈吗

    什么是JPA_论文题目不能用浅谈吗定义JPA即JavaPersistenceAPI。JPA是一个基于O/R映射的标准规范(目前最新版本是JPA2.1)。所谓规范即只定义标准规则(如注解、接口),不提供实现,软件提供商可以按照标准规范来实现,而使用者只需按照规范中定义的方式来使用,而不用和软件提供商的实现打交道。JPA的出现有两个原因:简化现有JavaEE和JavaSE应用的对象持久化的开发工作;Sun希……

    2022年10月20日
    0
  • Python 爬虫和数据分析实战

    Python 爬虫和数据分析实战课程介绍本课程是Python爬虫和数据分析项目实战课程,主要分3部分:第1部分是Python爬虫,主要使用Urllib3和BeautifulSoup抓取天猫商城和京东商城胸罩销售数据,并保存到SQLite数据库中;第2部分是对抓取的胸罩销售数据进行数据清洗,主要是去除空数据,让数据格式更规范;第3半部分利用Pandas对数据进行分析,以及使用M…

    2022年5月29日
    25
  • 本地项目上传到码云

    本地项目上传到码云

    2021年5月16日
    116
  • ringbuffer是什么_Buffer

    ringbuffer是什么_BufferRingBuffer的高级用法(类似内核KFIFO)环形缓冲区(ringbuffer),环形队列(ringqueue)多用于2个线程之间传递数据,是标准的先入先出(FIFO)模型。一般来说,对于多线程共享数据,需要使用mutex来同步,这样共享数据才不至于发生不可预测的修改/读取,然而,mutex的使用也带来了额外的系统开销,ringbuffer/queue的引入,就是为了有效地解…

    2022年9月11日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号