26_线程池_ThreadPoolExecutor

佐手、 提交于 2020-02-28 07:13:08

【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  //由调用线程处理该任务

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!