简单纪要:线程池的使用

ThreadPoolExecutor类

  public ThreadPoolExecutor(int corePoolSize,    
                              int maximumPoolSize, 
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
corePoolSize:核心线程数:核心线程会一直存活,即使不存在任务,并核心线程数不能为0,非则抛出异常(IllegalArgumentException);
maximumPoolSize:线程最大数:线程池所能创造最大个数,
a, 当前线程数 >= 核心核心线程数 创造新线程继续执行;
b, 当前线程数 = 线程最大数 抛出异常,拒绝处理任务;
keepAliveTime:线程空闲时间  当线程空闲时间达到 keepAliveTime时间时,当前线程会被杀死,直到达到核心线程数;
workQueue:线程池所使用的缓冲队列;
ThreadFactory:线程工厂,用于创建线程;
RejectedExecctionHandle:拒绝策略;


当核心线程数满了,阻塞队列也满了,此时
maximumPoolSize 扩容,如果maximumPoolSize 也满了,就会启动阻塞机制;

生产中常用的线程池配置

配置分为两类:

cpu密集型:本地CPU核数 + 1 

io   密集型:本地CPU核数 * 2

手动配置:

本地cpu核数  / 1 - 阻塞系数  (阻塞系数在 0.8 - 0.9 之间)

常见四种线程池

1) fixthreadPool: 固定数目线程池,正规的开发线程,多用于服务器,核心线程是没有超时机制的,队列没有大小,除非线程关闭了,核心线程才会被回收;

2)cacheThreadPool:只有非核心线程,最大线程数很大,他会为每一个任务添加一个线程,但是有超时时间,如果线程空闲时间 > 60s,会被回收;

3)singleThreadPool: 只有一个核心线程的线程池;

4)scheduledThreadPool:是一个有延期执行和周期重复执行的线程池,他的线程池固定,但其他线程随机创建,只要空闲,立即回收;

但是生产当中,以上四种线程池 很少使用甚至都不使用; 使用的是本文开篇所展示的代码形式;

原文地址:https://www.cnblogs.com/Rnan/p/10250420.html