一、JDK线程池概要

时间:2021-04-07 15:18:36

JDK线程池概要

  • 1、Executors,线程池执行器

    • 生成线程池的具体调用类

      • newFixedThreadPool

        • 创建一个定长的线程池,使用LinkedBlockingQueue作为任务队列
      • newSingleThreadExecutor

        • 创建一个单线程的线程池
      • newCachedThreadPool

        • 创建一个*线程池(最大线程池容量为最大int值),每一个任务都会新增一个线程,使用SynchronousQueue作为任务队列

        • 若有线程60秒闲置,则会回收该线程

      • newScheduledThreadPool

        • 创建一个*线程池,使用DelayedWorkQueue作为任务队列,支持定时周期执行任务
  • ExecutorService

    • 统一的线程池执行器接口
  • ThreadPoolExecutor

    • ExecutorService的实现

    • 核心参数:

      • corePoolSize

        • 核心线程数,在线程数少于该值时,若有任务提交,则会创建线程
      • maximumPoolSize

        • 线程池最大线程数

        • 当线程数达到corePoolSize,新来的任务会放入任务队列,当任务队列满了,则会新建线程,直到线程数达到maximumPoolSize

      • workQueue

        • 线程池任务队列,存放待执行任务
      • keepAliveTime

        • 当超过corePoolSize数目的线程空闲时间达到keepAliveTime,线程会退出
        • 只有超过corePoolSize的线程会退出
      • threadFactory

        • 线程工厂类
      • handler

        • 当线程池中的线程数大于maximumPoolSize,对拒绝任务的处理策略

        • 默认值ThreadPoolExecutor.AbortPolicy(),直接抛出拒绝执行异常

          a) CallerRunsPolicy:如果发现线程池还在运行,就直接运行这个线程

          b) DiscardOldestPolicy:如果线程池还在运行,抛弃任务队列里第一个任务(最早的任务),然后执行当前任务

          c) DiscardPolicy:什么也不做

          d) AbortPolicy:java默认,抛出一个异常:RejectedExecutionException

  • ThreadFactory

    • 创建线程的工厂,非线程池
  • ScheduledThreadPoolExecutor

    • 周期性调度线程池执行器

2、阻塞队列

  • 线程池的任务队列通过阻塞队列实现,常用的阻塞队列:LinkedBlockingQueue、SynchronousQueue等

    • add(E e)

      • 放进队列,调用offer,如果成功,返回true,否则抛异常,立即返回
    • offer(E e)

      • 放进队列,如果队列满了,返回失败,立即返回
    • put(E e)

      • 放进队列,如果队列满了,此方法会阻塞住,直到队列不满
    • offer(E e, long timeout, TimeUnit unit)

      • 放进队列,如果队列满了,会阻塞timeout的时间
    • take()

      • 取值,如果队列为空,阻塞直到队列有值
    • poll(long timeout, TimeUnit unit)

      • 取值,如果队列为空,阻塞timeout时间
  • LinkedBlockingQueue

    • 链表实现的阻塞队列,按先进先出排序

    • 若未指定容量,默认Integer.MAX_VALUE

  • SynchronousQueue

    • 基于生产消费者模式的特殊队列,无容器,相当于只能存放一个值

    • 出队、入队操作,需配对出现,否则会阻塞

  • DelayedWorkQueue

    • 周期性调度执行器里内置的延迟队列