找回密码
 立即注册
首页 业界区 业界 【学习OR面试】请你介绍一下线程池(1) ...

【学习OR面试】请你介绍一下线程池(1)

宁觅波 昨天 16:34
推荐阅读:
Java线程池实现原理及其在美团业务中的实践 - 美团技术团队
1.线程池是什么?


  • 定义:工具
  • 解决问题:在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。
  • 用途:管理和复用线程,减少线程的创建和销毁开销。
  • 总结:线程池是用来管理和复用线程的工具,它可以减少线程的创建和销毁开销。
2.线程池的核心参数?

4+2+1=7

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

任务提交 → 核心线程执行任务队列缓存非核心线程执行拒绝策略处理
  1. if 正在运行的线程数<核心线程数:直接使用空闲的核心线程 或 创建核心线程来执行
  2. else if 正在运行的线程数>=核心线程数:放入等待队列
  3. else if 等待队列满了&&正在运行的线程数<最大线程数:创建非核心线程来执行(刚刚提交的这个任务)
  4. else if 等待队列满了&&正在运行的线程数>=最大线程数:拒绝策略的执行
  5. 最后:线程执行完毕后,线程并不会立即销毁,而是继续保持,在池中等待下一个任务。
  6. 但是,当非核心线程空闲时间超出存活时间(当前线程数量大于核心线程数时),线程会被回收。
复制代码
总结为5种情况
4.拒绝策略有哪些?


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

【这个图精辟!】
5.线程池有哪几种阻塞队列?

五种。

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册