线程池概念

源于JDK1.5版本之后的Executor接口,通过ThreadPoolExceutor进行实现,而ThreadPoolExecutor继承于AbstractExecutorService,AbstractExecutorService 是ExecutorService的实现,ExecutorService继承了Executor接口.

线程池的优点

1,重用线程池中的线程,避免的频繁创建和销毁线程所带来的内存开销

2,有效的控制最大的并发数,避免线程之前因抢占资源而阻塞

3,简单管理线程,提供定时执行及指定时间间隔循环执行

常用构造方法参数

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

corePoolSize,核心线程数(默认情况下一直存活于线程池,即使处于闲置),如果ThreadPoolExecutor中allowCoreThreadTimeOut
为true,则核心线程在等待新任务是有超时终止策略,超时时间由keepAliveTime决定

maximumPoolSize 最大线程数,当线程数超过这个值,则新任务将被阻塞

keepAliveTime 非核心线程超时时长,超过这个时间讲被回收,当核心线程设置了AllowCoreThreadTimeOut为true时,keepAliveTime同样适用于核心线程

unit,指定KeepAliveTime参数的时间单位

workQueue,线程池中任务队列,存储新提交的Runnable对象

threadFactory,线程工厂,为线程池创建新线程

handler,不常用参数,类型为RejectedExecutionHandler,当线程池无法执行新任务时间,会调用Handler抛出异常

执行规则

1)线程池中数量未达到核心线程数,则直接启动核心线程
2)线程池中线程数超过核心线程数量,则被插入到任务队列中排队等待执行
3)第二步中无法插入新任务,说明队列已满,如未达到规定最大线程数量,则启动非核心线程执行
4)如果线程数量超过最大值,则拒绝任务并通用RejectedExecutionHandler通知调用者

线程池主要分为四类

1,FixedThreadPool

特点
1)线程数量固定且都是核心线程,核心线程数量和最大线程数量都是nThreads
2)核心线程不会被回收,快速响应外界请求
3)没有超时机制,任务队列没有大小限制
4)新任务使用核心线程处理,没有空闲核心线程,则排队等待执行

public static ExecutorService newFixedThreadPool(int nThreads){
        return new ThreadPoolExecutor(nThreads,nThreads,
                                                            0L,TimeUnit.MILLISECONDS,
                                                            new LinkedBlockingQueue<Runnable>());
}

2,CachedThreadPool

特点
1)线程数量不定,只有非核心线程,最大线程数任意大,传入核心线程数量为0,最大线程数为Integer.MAX_VALUE;
2)新任务来时使用空闲线程执行,没有空闲线程则创建新线程处理
3)每个空闲线程都有超时机制,时长60s,空闲线程超过60时,则被回收
4)适合执行大量耗时较少的任务,

public static ExecutorService newCacheThreadPool(){
        return new ThreadPoolExecutor(0,Integer.MAX_VALUE,
                                                            60L,TimeUnit.SECONDS,
                                                             new SynchronusQueue<Runable>());
}

3,ScheduledThreadPool

特点
1)核心线程数量固定,非核心线程数量无限
2)非核心线程闲置10s会被回收
3)主要用户执行定时任务和具有固定周期的重复任务
4)唯一有延时执行和周期重复执行能力,主要用户处理任务队列延迟的工作

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
    //默认闲置超时回收时常
    private static final long DEFAULT_KEEPALIVE_MILLIS = 10L;
    public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE,
              DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
              new DelayedWorkQueue());
    }

4,SingleThreadExecutor(单例程池)

特点
1)只有一个核心线程,所有任务在同一个线程池中按顺序执行
2)所有外界任务统一道一个线程中,不需要处理同步

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

如上四种线程池的实现最终都是以ThreadPoolExecutor为基础增加相关的扩展性实现