0%

thread-pool

0.0.1. ThreadPoolExecutor

1
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
  • corePoolSize: 核心线程数, 如果运行的线程少于corePoolSize, 则创建新线程来执行新任务, 即使线程池中的其他线程是空闲的
  • maximumPoolSize:最大线程数, 可允许创建的线程数, corePoolSize和maximumPoolSize设置的边界自动调整池大小:
  • corePoolSize <运行的线程数< maximumPoolSize:仅当队列满时才创建新线程
  • corePoolSize=运行的线程数= maximumPoolSize: 创建固定大小的线程池
  • keepAliveTime:如果线程数多于corePoolSize, 则这些多余的线程的空闲时间超过keepAliveTime时将被终止
  • unit:keepAliveTime参数的时间单位
  • workQueue:保存任务的阻塞队列, 与线程池的大小有关:
  • threadFactory:使用ThreadFactory创建新线程, 默认使用defaultThreadFactory创建线程
  • handle:定义处理被拒绝任务的策略, 默认使用ThreadPoolExecutor.AbortPolicy, 任务被拒绝时将抛出RejectExecutorException

0.0.2. CompletionService

0.0.3. 默认线程池的分类

  • newSingleThreadExecutor
  • newCachedThreadPool
  • newFixedThreadPool
  • newScheduledThreadPool
  • newSingleThreadScheduledExecutor

0.0.4. 线程池的状态

  1. RUNNING
  2. SHUTDOWN
  3. STOP
  4. TIDYING
  5. TERMINATED

0.0.5. 添加任务的过程

  1. 如果此时线程池中的数量小于corePoolSize, 即使线程池中的线程都处于空闲状态, 也要创建新的线程来处理被添加的任务.
  2. 如果此时线程池中的数量等于corePoolSize, 但是缓冲队列 workQueue未满, 那么任务被放入缓冲队列.
  3. 如果此时线程池中的数量大于corePoolSize, 缓冲队列workQueue满, 并且线程池中的数量小于maximumPoolSize, 建新的线程来处理被添加的任务.
  4. 如果此时线程池中的数量大于corePoolSize, 缓冲队列workQueue满, 并且线程池中的数量等于maximumPoolSize, 那么通过 handler所指定的策略来处理此任务.

0.0.6. 拒绝策略

  1. AbortPolicy
    当任务添加到线程池中被拒绝时, 它将抛出 RejectedExecutionException 异常.
  2. CallerRunsPolicy
    当任务添加到线程池中被拒绝时, 会在线程池当前正在运行的Thread线程池中处理被拒绝的任务.自动重试提交任务, 直到成功.
  3. DiscardOldestPolicy
    当任务添加到线程池中被拒绝时, 线程池会放弃等待队列中最旧的未处理任务, 然后将被拒绝的任务添加到等待队列中.
  4. DiscardPolicy
    当任务添加到线程池中被拒绝时, 线程池将丢弃被拒绝的任务.

1. Resource

Queue