对于线程池大部分人可能会用,也知道为什么用。无非就是任务需要异步执行,再者就是线程需要统一管理起来。对于从线程池中获取线程,大部分人可能只知道,我现在需要一个线程来执行一个任务,那我就把任务丢到线程池里,线程池里有空闲的线程就执行,没有空闲的线程就等待。实际上对于线程池的执行原理远远不止这么简单。

  在Java并发包中提供了线程池类——ThreadPoolExecutor,实际上更多的我们可能用到的是Executors工厂类为我们提供的线程池newFixedThreadPool、newSingleThreadPool、newCachedThreadPool,这三个线程池并不是ThreadPoolExecutor的子类,关于这几者之间的关系,我们先来查看ThreadPoolExecutor,查看源码发现其一共有4个构造方法。

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)

  首先就从这几个参数开始来了解线程池ThreadPoolExecutor的执行原理

  corePoolSize:核心线程池的线程数量

  maximumPoolSize:最大的线程池线程数量

  keepAliveTime:线程活动保持时间,线程池的工作线程空闲后,保持存活的时间。

  unit:线程活动保持时间的单位。

  workQueue:指定任务队列所使用的阻塞队列

  corePoolSizemaximumPoolSize都在指定线程池中

网友评论