java 多线程之ThreadPoolExecutor参数设置


1参数介绍:

java1.5引入的ThreadPoolExecutor,构造参数中有如下几个参数。

参数名作用
corePoolSize核心线程池大小
maximumPoolSize最大线程池大小
keepAliveTime线程池中超过corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间
TimeUnitkeepAliveTime时间单位
workQueue阻塞任务队列
threadFactory新建线程工厂
RejectedExecutionHandler当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理


corePoolSize》workQueue》maximumPoolSize之间关系

有新的任务时:

  1. 当线程数小于核心线程数时,创建新线程。
  2. 当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列,此时不会创建新线程。
  3. 当线程数大于等于核心线程数,且任务队列已满
    1. 若线程数小于最大线程数,创建新线程
    2. 若线程数等于最大线程数,抛出异常,拒绝任务

3 线程池种类:

3.1 FixedThreadPool 适用为了满足资源管理的需求,需要限制线程数的场景,适用于fu'z负载比较重的服务器3.2 SingleThreadPool 需要保证顺序地执行各个任务;并且在任务时间点,不会有多线程获得场景。3.3 CacheThreadPool 大小无界的线程池,适用于执行很多的短期异步任务的小任务,或者负载较轻的服务器。3.4newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

4 4个线程池和ThreadPoolExecutor关系

4.1 FixedThreadPool 创建方法:
Executors.newFixedThreadPool(2)
Executors中方法
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}

4.2 SingleThreadPool 创建方法
private static ExecutorService threadPool2 = Executors.newSingleThreadExecutor();
Executors中:
 public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}

4.3 CacheThreadPool 创建方法
private static ExecutorService threadPool3 = Executors.newCachedThreadPool();
Executors中:
    public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());



4.4newScheduledThreadPool 创建方法
private static ExecutorService threadPool4 = Executors.newScheduledThreadPool(10);

Executors中:
 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}

 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
 public ThreadPoolExecutor(int corePoolSize,                              int maximumPoolSize,                              long keepAliveTime,                              TimeUnit unit,                              BlockingQueue<Runnable> workQueue) {        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,             Executors.defaultThreadFactory(), defaultHandler);    }


从上述源码中可以看出,四个源码在底层都是调用ThreadPoolExecutor构造方法实现。也就是说4中线程池,只是ThreadPoolExecutor设置不同参数构造处理来。本质上都是ThreadPoolExecutor。



智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告