博客免责说明

1.博客主要是为了记录工作、学习中遇到的问题,可能由于本人技术有限,有些不正确的地方,仅供参考。

 

2.博客中会转载我认为有用的博客文章,添加一些论坛或网站地址,但这些博客文章、论坛和网站上的内容和我没有关系,不代表我的意见,请网友自己多注意辨别。

 

3.博客中转载文章会写明来源,感谢原作者的辛苦写作,如果有异议,及时联系我处理,谢谢!

 

4.欢迎指出有问题的地方,我会尽快修正,谢谢!

 

xkzhangsanx

 

Java线程池定制ThreadPoolExecutor官方定制实例

1.仍然先看构造方法:ThreadPoolExecutor构造方法

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
        BlockingQueue workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
corePoolSize:核心池的大小;
maximumPoolSize:线程池最大线程数;
keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止;
unit:参数keepAliveTime的时间单位(TimeUnit);
workQueue:一个阻塞队列,用来存储等待执行的任务;
threadFactory:线程工厂,主要用来创建线程;
handler:表示当拒绝处理任务时的策略,有以下四种取值:
(1)AbortPolicy丢弃任务并抛出RejectedExecutionException异常,默认策略
(2)DiscardPolicy:也是丢弃任务,但是不抛出异常
(3)DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务
(4)CallerRunsPolicy:由调用线程处理该任务(不创建新线程)
 
2.官方定制Executors定制
(1)newSingleThreadExecutor()源码
    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue()));
    }

通过源码可以看到:

corePoolSize:核心池的大小=1
maximumPoolSize:线程池最大线程数=1
keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止=0
unit:参数keepAliveTime的时间单位(TimeUnit)=MILLISECONDS(毫秒)
workQueue:一个阻塞队列,用来存储等待执行的任务=LinkedBlockingQueue队列
threadFactory:线程工厂,主要用来创建线程:没有写出,使用默认工厂类
handler:表示当拒绝处理任务时的策略,有以下四种取值:没有写出,使用AbortPolicy策略
 
 
(2)newFixedThreadPool(int nThreads)源码
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue());
    }

 

通过源码可以看到:

corePoolSize:核心池的大小=nThreads
maximumPoolSize:线程池最大线程数=nThreads
keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止=0
unit:参数keepAliveTime的时间单位(TimeUnit)=MILLISECONDS(毫秒)
workQueue:一个阻塞队列,用来存储等待执行的任务=LinkedBlockingQueue队列
threadFactory:线程工厂,主要用来创建线程:没有写出,使用默认工厂类
handler:表示当拒绝处理任务时的策略,有以下四种取值:没有写出,使用AbortPolicy策略
 
 
(3)newCachedThreadPool()源码
    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue());
    }

 

通过源码可以看到:

corePoolSize:核心池的大小=0
maximumPoolSize:线程池最大线程数=Integer.MAX_VALUE(2147483647)
keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止=60
unit:参数keepAliveTime的时间单位(TimeUnit)=SECONDS(秒)
workQueue:一个阻塞队列,用来存储等待执行的任务=SynchronousQueue队列
threadFactory:线程工厂,主要用来创建线程:没有写出,使用默认工厂类
handler:表示当拒绝处理任务时的策略,有以下四种取值:没有写出,使用AbortPolicy策略