26_线程池_内部实现_ThreadPoolExecutor

Posted HigginCui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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  //由调用线程处理该任务

 

以上是关于26_线程池_内部实现_ThreadPoolExecutor的主要内容,如果未能解决你的问题,请参考以下文章

阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第5节 线程池_2_线程池的代码实现

线程池

C实现线程池

python线程池实现

37.bind和function实现mini线程池

37.bind和function实现mini线程池