线程池工作流程详解

773 阅读1分钟

线程池

线程池是一种池化技术,池化技术的思想主要是为了减少每次获取资源的消耗,线程池避免了避免了频繁创建和销毁线程。

线程池的创建

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    2,                                          //核心线程数corePoolSize
    5,                                          //最大线程数maximumPoolSize
    10,                                         //保持存活时间keepAliveTime
    TimeUnit.SECONDS,                           //时间单位
    new ArrayBlockQueue<Runable>(6),            //任务队列
    new ThreadPoolExecutor.AbortPolicy()        //饱和策略
);

工作流程

模拟20个无限循环查看线程池的工作流程

1.先判断线程池中的线程是否大于corePoolSize,若是则放入线程池。

2.若线程池中的线程大于corePoolSize,则放入队列中。

3.若队列也满了,再放入线程池中。

4.若线程池满 了,则通过饱和策略进行处理。

队列类型

  1. SynchronousQueue

    同步队列,容量为1

  2. LinkedBlockingQueue

    无界队列

  3. ArrayBlockingQueue

    有界队列

线程池类型

  1. newCachedThreadPool

    可缓存的队列

    corePoolSzie=0;maximumPoolSize=Integer.MaxValue; 可以看作线程池无限大。

    队列采用SynchronousQueue

  2. newFixedThreadPool(int nThreads)

    定长线程池

    corePoolSzie=nThreads;maximumPoolSize=nThreads;

    队列采用LinkedBlockingQueue

  3. newSingleThreadExecutor

    单例线程池

    corePoolSzie=1;maximumPoolSize=1;

    队列采用LinkedBlockingQueue

  4. newSheduleThreadPool

    调度线程池

    • 延时执行队列 shedule方法

      参数 shedule(任务,延长时间,时间单位)

    • 周期性执行 sheduleAtFixedRate方法

      参数sheduleAtFixedRate(任务,延长时间,间隔时间,时间单位)