欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

【学习OR面试】请你介绍一下线程池(1),用途:管理和复用线程

来源: javaer 分享于  点击 11357 次 点评:238

【学习OR面试】请你介绍一下线程池(1),用途:管理和复用线程


推荐阅读:
https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html

1.线程池是什么?

  • 定义:工具

  • 解决问题:在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。

  • 用途:管理和复用线程,减少线程的创建和销毁开销。

  • 总结:线程池是用来管理和复用线程的工具,它可以减少线程的创建和销毁开销。

2.线程池的核心参数?

4+2+1=7

  • 核心线程数、最大线程数、任务队列和拒绝策略
  • 非核心线程的存活时间和参数单位(核心线程默认不会销毁)
  • 线程工厂

3.线程池的工作流程?

任务提交 → 核心线程执行 → 任务队列缓存 → 非核心线程执行 → 拒绝策略处理。

if 正在运行的线程数<核心线程数:创建核心线程来执行
else if 正在运行的线程数>=核心线程数:放入等待队列
else if 等待队列满了&&正在运行的线程数<最大线程数:创建非核心线程来执行
else if 等待队列满了&&正在运行的线程数>=最大线程数:拒绝策略的执行

最后:线程执行完毕后,线程并不会立即销毁,而是继续保持,在池中等待下一个任务。
但是,当非核心线程空闲时间超出存活时间(当前线程数量大于核心线程数时),线程会被回收。

总结为5种情况

4.拒绝策略有哪些?

  • AbortPolicy:默认的拒绝策略,会抛 RejectedExecutionException 异常。
  • CallerRunsPolicy:让提交任务的线程自己来执行这个任务,也就是调用 execute 方法的线程。
  • DiscardOldestPolicy:等待队列会丢弃队列中最老的一个任务,也就是队列中等待最久的任务,然后尝试重新提交被拒绝的任务。
  • DiscardPolicy:丢弃被拒绝的任务,不做任何处理也不抛出异常。

【这个图精辟!】

5.线程池有哪几种阻塞队列?

五种。

  • ArrayBlockingQueue:底层是数组,有界,先进先出,适合固定大小的线程池。
  • LinkedBlockingQueue:底层是链表,无界(Integer.MAX_VALUE)。
  • PriorityBlockingQueue:类比优先队列(堆实现),无界,可以排序。如其名:优先级高的先出。
  • DelayQueue:类比PriorityBlockingQueue,带有延迟功能:元素在指定时间点之后才能取出。
  • SynchronousQueue:同步队列,生产者放入元素必须等待消费者取走,否则阻塞。
相关栏目:

用户点评