ThreadPoolExecutor原理、使用分析
2020-09-29 15:35:00   1  举报             
     
         
 ThreadPoolExecutor执行过程分析,封装思想整理
    作者其他创作
 大纲/内容
 task
    1. 当线程池中的线程小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程
  销毁
  任务执行
  maximumPoolSize
  DiscardPolicy:直接丢弃任务
  threadPool
  keepAliveTime到了
  workqueue
  corePoolSize
  ThreadPoolExecutor包装模式(Executors)
  DiscardOldestPolicy:抛弃队列中等待最久的任务,加入当前任务
  执行
  RejectedExecutionHandler handler
  AbortPolicy:直接抛出RejectedExecutionException给提交任务方法
  空闲时间keepAliveTimeunit
  CallerRunsPolicy:退回给调用者,减小流量
  3. 当workQueue已满,且maximumPoolSize大于corePoolSize时,新提交任务会创建新线程执行任务
  ThreadPoolExecutor
  workers(threadPool)
  4. 当提交任务数超过马项目吗PoolSize+workQueue时,新提交任务由RejectedExecutionHandle处理
  ThreadPoolExecutor执行过程分解
  6. 当有空闲线程时,workQueue中的任务会被调用执行
  需判断allowCoreThreadTimeOut == true
  Executors的静态创建方法
  keepAliveTime
  unit
  workQueue
  问题
  newFixedThreadPool
  nThreads(参数)
  0L
  TimeUnit.MILLISECONDS
  LinkedBlockingQueue
  workQueue无界
  newCachedThreadPool
  0
  Integer.MAX_VALUE
  60L
  TimeUnit.SECONDS
  SynchronousQueue(只能有一个元素的阻塞队列)
  线程数约等于无界
  newScheduledThreadPool:ScheduledThreadPoolExecutor
  corePoolSize(参数)
  NANOSECONDS
  DelayedWorkQueue(定制的优先级队列)
  newSingleThreadExecutor
  1
  ThreadPoolExecutor依赖处理
  2. 当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行。
  拒绝策略
  5. 当线程池中线程数超过corePoolSize,空闲时间超过keepAliveTime的线程会被销毁
  完成上一节的任务,ThreadPoolExecutor需要:1. 等待队列,当核心线程满的时候,暂存任务。通过workqueue注入。2. 需要线程执行任务,创建线程太麻烦,注入threadFactory来创建线程。3. 线程放到workers中记录执行4. 线程池需要一个空闲清除时间,注入。5. 当装满了,装不下了。需要拒绝新来任务。怎么拒绝?注入把。学习这种依赖管理办法,通过接口隔离,注入来完成功能扩展。
  RejectedExecutionHandle
  线程
  疑问:taskQueue中有数据时,corePoolSize会空闲过期吗?疑问:非核心线程会去执行taskQueue中的任务吗?
  线程创建threadFactory
   
 
 
 
 
  0 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 