1. newCachedThreadExcutor
大小为0, 60s存活, 使用同步队列实现, 最大数为int最大值, 适用于短期异步或者负载比较轻的情况下
2. newFixedThreadExcutor
固定大小的线程池, 存活时间不限. 且新增则进入阻塞队列. 适用于长期任务的执行
3. newSingleThreadExcutor
单线程的线程池, 时间无限, 适用于一个任务接着一个任务的执行
4. SeceduledThreadPool
定时任务的线程池
线程池可以通过ThreadPoolExecutor来创建,我们来看一下它的构造函数:
提交一个任务,线程池里存活的核心线程数小于线程数corePoolSize时,线程池会创建一个核心线程去处理提交的任务。
如果线程池核心线程数已满,即线程数已经等于corePoolSize,一个新提交的任务,会被放进任务队列workQueue排队等待执行。
当线程池里面存活的线程数已经等于corePoolSize了,并且任务队列workQueue也满,判断线程数是否达到maximumPoolSize,即最大线程数是否已满,如果没到达,创建一个非核心线程执行提交的任务。
如果当前的线程数达到了maximumPoolSize,还有新的任务过来的话,直接采用拒绝策略处理。
四种拒绝策略
AbortPolicy(抛出一个异常,默认的)
DiscardPolicy(直接丢弃任务)
DiscardOldestPolicy(丢弃队列里最老的任务,将当前这个任务继续提交给线程池)
CallerRunsPolicy(交给线程池调用所在的线程进行处理)