线程池ThreadPoolExecutor参数简析

墨蓝 2023-06-24 15:22 87阅读 0赞

创建线程池推荐使用ThreadPoolExecutor,而不是Executors

Executors包含四种创建线程池的方法

  1. newFixedThreadPool:可重用固定线程数的线程池
  2. newSingleThreadExecutor:只有一个线程的线程池
  3. newCachedThreadPool :根据需要创建新线程的线程池
  4. newScheduledThreadPool:主要是在给定延时后执行异步任务或者周期性执行任务

FixedThreadPool和SingleThreadExecutor使用无界队列 LinkedBlockingQueue(队列的容量为 Intger.MAX_VALUE)作为线程池的工作队列,当线程池中的线程达到了核心线程数时,新的任务会加入到工作列队中,任务过多时会触发OOM异常。

CachedThreadPool和ScheduledThreadPool最大线程数为Integer.MAX.VALUE,线程一直创建最后会导致OOM异常。

ThreadPoolExecutor所有的构造函数最后都是调用的这个构造方法

  1. public ThreadPoolExecutor(int corePoolSize,
  2. int maximumPoolSize,
  3. long keepAliveTime,
  4. TimeUnit unit,
  5. BlockingQueue<Runnable> workQueue,
  6. ThreadFactory threadFactory,
  7. RejectedExecutionHandler handler)

corePoolSize:线程池核心线程数

maximumPoolSize:线程池最大连接数

keepAliveTime:超出核心线程数的线程的最大空闲时间

workQueue:用于存放任务,并将任务交给工作线程

threadFactory:创建线程的工厂,所有的线程都是通过它创建

handler:当所有线程和工作队列都饱和时采取的拒绝策略

线程池示意图

  1. 用户提交任务,直接创建一个核心线程去执行,创建线程使用threadFactory
  2. 执行完毕之后,核心线程被阻塞,不会被回收(一般来说,线程池的核心线程是不会被回收的,除非设置了allowCoreThreadTimeOut)
  3. 再次提交任务之后,新建一个核心线程去执行任务,一直到核心线程数达到corePoolSize,则不再新建核心线程(达不到corePoolSize之前即使核心线程闲置也会新建核心线程去执行任务)
  4. 当所有的核心线程都在执行任务时,新来的任务进入到队列中排队等待
  5. 若队列也被放满了,创建新的线程去执行任务(创建新线程的数量加上核心线程数不能超过maximumPoolSize)
  6. 若新创建的线程空闲下来,超过keepAliveTime的时间还没有任务可执行,就回收这个线程
  7. 当线程数量达到maximumPoolSize,且队列已满,还不断的有新的任务过来的时候,使用handler的拒绝策略处理新来的任务

如果上面写的东西太过笼统看不懂的话,推荐看一下这篇文章:
线程池开门营业招聘开发人员的一天

如果有理解不当的地方,还望各位大佬不吝指正

发表评论

表情:
评论列表 (有 0 条评论,87人围观)

还没有评论,来说两句吧...

相关阅读