java线程池

320 阅读2分钟

4种线程池

  1. newFixedThreadPool,创建一个固定大小的线程池,因为采用无界的阻塞队列,所以实际线程数量永远不会变化,适用于负载较重的场景,对当前线程数量进行限制。(保证线程数可控,不会造成线程过多,导致系统负载更为严重)。
  2. newCachedThreadPool,用来创建一个可以无限扩大的线程池,适用于负载较轻的场景,执行短期异步任务。(可以使得任务快速得到执行,因为任务时间执行短,可以很快结束,也不会造成cpu过度切换)
  3. newSingleThreadExecutor:创建一个单线程的线程池,适用于需要保证顺序执行各个任务。
  4. newScheduledThreadPool:适用于执行延时或者周期性任务。

线程池常用参数

  1. corePoolSize(线程池基本大小):当向线程池提交一个任务时,若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corePoolSize。
  2. maximumPoolSize(线程池最大大小):线程池所允许的最大线程个数。当队列满了,且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程来执行任务。另外,对于无界队列,可忽略该参数。
  3. keepAliveTime(线程存活保持时间)当线程池中线程数大于核心线程数时,线程的空闲时间如果超过线程存活时间,那么这个线程就会被销毁,直到线程池中的线程数小于等于核心线程数。
  4. workQueue(任务队列):用于传输和保存等待执行任务的阻塞队列。
  5. threadFactory(线程工厂):用于创建新线程。threadFactory创建的线程也是采用new Thread()方式。
  6. handler(线程饱和策略):当线程池和队列都满了,再加入线程会执行此策略。

线程池执行顺序

  1. 判断核心线程池是否已满,没满则创建一个新的工作线程来执行任务。
  2. 判断任务队列是否已满,没满则将新提交的任务添加在工作队列。
  3. 判断整个线程池是否已满,没满则创建一个新的工作线程来执行任务,已满则执行饱和策略。

主要内容来源于:Java线程池详解