Java线程池笔记
总结
- 线程池核心为java.uitl.concurrent.ThreadPoolExecutor类,该类有几个构造函数,实际上调用的是一个,其参数的大致含义:- corePoolSize:核心池的大小
- maximumPoolSize:线程池最大线程数
- keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。
- unit:参数keepAliveTime的时间单位
- workQueue:一个阻塞队列,用来存储等待执行的任务
- threadFactory:线程工厂,主要用来创建线程;
- handler:表示当拒绝处理任务时的策略,有以下四种取值:
 ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。 ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
 ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
 
- 一般来说,提交一个任务,
    - 当前线程数小于corePoolSize,则新建线程来执行;
- 大于corePoolSize,则放入队列workQueue;
- 队列满了以后,如果线程数小于maximumPoolSize,则新建线程来执行;
- 大于maximumPoolSize,则根据拒绝处理任务时的策略处理。
 
- 当前线程数小于
- 一般来说,当一个任务被线程执行完毕,
    - 当前若不为空闲,继续执行其他任务;
- 若空闲keepAliveTime单位时间后,线程数大于corePoolSize,释放该线程;
- 线程数小于corePoolSize,无特殊设置不处理;
 
- Executors类中提供的几个静态方法来创建线程池,实际上也是调用了- ThreadPoolExecutor- FixedThreadPool创建的线程池corePoolSize和maximumPoolSize值是相等的,它使用的LinkedBlockingQueue;
- SingleThreadExecutor将corePoolSize和maximumPoolSize都设置为1,也使用的LinkedBlockingQueue;
- CachedThreadPool将corePoolSize设置为0,将maximumPoolSize设置为Integer.MAX_VALUE,使用的SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。