26_线程池_ThreadPoolExecutor
【ThreadPoolExecutor简述】
无论是Executors类的newFixedThreadPool()、newSingleThreadExecutor(),还是newCachedThreadPool()方法,虽然看起来创建的线程有着完全不同的特点,期内部实现均使用了ThreadPoolExecutor实现。
下面展示一下Executors类中对应的以上几个静态方法的源码:
[ newFixedThreadPool()方法 ]
[ newSingleThreadExecutor()方法]
[ newCachedThreadPool()方法 ]
【ThreadPoolExecutor构造方法】
以上线程池的实现代码可以看到,他们都是ThreadPoolExecutor类的封装。
ThreadPoolExecutor类功提供了四个构造方法
public class ThreadPoolExecutor extends AbstractExecutorService { public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler); }
【参数详解】
* courePoolSize
指定了线程池中的线程数量。默认情况下,线程池中没有任何线程,而是等待有任务到来才去创建线程并执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这两个方法名字可以看出,就是预创建线程的意思,即在任务到来之前就创建了corePoolSize个线程或者1个线程。默认情况下,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务。当线程池的线程数目达到corePoolSize后,就会把达到的任务放到缓存队列当中。
* maximumPoolSize
指定了线程池中最大线程数量。它表示线程池最多能创建多少个线程。
* keepAliveTime
表示线程池中的线程没有任务执行时最多或保留多久时间会终止。
默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,即超过corePoolSize的空闲线程,在多长的时间内,会被销毁。
* unit
参数keepAliveTime的时间单位,有7种取值
TimeUnit.DAYS; //天 TimeUnit.HOURS; //小时 TimeUnit.MINUTES; //分钟 TimeUnit.SECONDS; //秒 TimeUnit.MILLISECONDS; //毫秒 TimeUnit.MICROSECONDS; //微妙 TimeUnit.NANOSECONDS; //纳秒
* workQueue
一个阻塞任务队列,用来存储等待执行的任务,这个参数的选择非常重要,会对线程池的运行过程产生较大影响。
一般可以选择如下:
ArrayBlockingQueue; //使用较少 LinkBlockingQueue; //经常使用 SynchronousQueue; //经常使用
* threadFactory
线程工厂,主要用来创建线程,一般选择默认即可
* handler
拒绝策略,当任务太多时,如何拒绝任务。
一共有以下取值:
ThreadPoolExecutor.AbortPolicy //直接丢弃任务,抛出RejectedExecutionException异常,阻止系统工作 ThreadPoolExecutor.DiscardPolicy //丢弃任务,不予任何处理,不抛出异常 ThreadPoolExecutor.DiscardOldestPolicy //丢弃最老的一一个任务,即队列最前面的任务,然后重新尝试执行任务,并重复此过程 ThreadPoolExecutor.CallerRunsPolicy //由调用线程处理该任务