码迷,mamicode.com
首页 > 编程语言 > 详细

ThreadPoolExecutor线程池

时间:2015-07-29 23:10:59      阅读:321      评论:0      收藏:0      [点我收藏+]

标签:

ExecutorService (具有服务生命周期的Executor)  是一个接口,用于执行线程的服务,有两个具体的实现类  
    ScheduledThreadPoolExecutor, ThreadPoolExecutor

ExecutorService的生命周期:  ExecutorService有3种生命状态  运行,关闭,终止
    ExecutorService创建时,处于运行状态
                 调用shutdown()处于关闭状态 (关闭状态时,已经被添加的方法仍会继续执行) isShutDown()返回true
                 调用shutdownNow()或者所有添加的线程执行完毕时,处于终止状态 isTerminate()返回true    


ThreadPoolExecutor 构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
            ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), handler);
 参数解释:
 corePoolSize 线程池中维护的最少的线程数量,没有任务也会一直存活
 maximumPoolSize 线程池中线程的最大数量
 keepAliveTime  线程数量>corePoolSize 时,线程完成后,该线程回收的最大空闲时间
 workQueue  线程池所使用的缓冲队列,通常为LinkedBlockingQueue
 ThreadFactory 创建线程的工厂(接口,覆盖newThread(Runnable r)方法,返回一个自定义的Thread) 
 handler当线程数量大于maximumPoolSize时,拒绝任务的处理策略,默认ThreadPoolExecutor.AbortPolicy()


ThreadPoolExecutor对象调用 execute(Runnable) 方法 来执行一个线程  

ThreadPoolExecutor对象可以由Executors类的静态方法获得,如下

public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
 
 
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
 
 
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}

newFixedThreadPool使用了有限的线程集来提交所执行的任务,直接从线程池中获取线程.
newCachedThreadPool线程池中corePoolSize为0,在需求中创建于所需数量相同的线程,然后回收时最大空闲时间为60s
newSingleThreadExecutor 就是线程数量为1的FixedThreadPool,如果提交了多个任务,这些任务将排队

ThreadPoolExecutor添加任务时的具体过程(重点看):
运行的线程数量小于corePoolSize时,添加并执行线程    继续添加Task....
           等于corePoolSize时,放入workQueue    继续添加Task....
        > corePoolSize     workQueue已经放满  线程数量小于  maximumPoolSize.创建新线程直至数量到maximumPoolSize 继续添Task....
        > corePoolSize     workQueue已经放满   maximumPoolSize也装满,新提交任务由Handler处理
                                                                    (构造方法的最后一个参数,后面有介绍) 
    Task未新添加...线程渐渐执行完毕
        多余线程空闲时间超过keepAliveTime时,会关闭这部分线程,直到线程数量为corePoolSize


BlockingQueue<Runnable> 常用下面几种
  
SynchronousQueue (默认)直接提交线程,直接提交通常要求无界maximumPoolSizes 以避免拒绝新提交的任务
 LinkedBlockingQueue 无界队列,将导致在所有 corePoolSize 线程都忙时新任务在队列中等待,创建的线程就不会超过 corePoolSize,maximumPoolSize的值也就无效了
  ArrayBlockingQueue 有界队列,很难控制,队列大小和maximumPoolSizes要相互折中


RejectedExecutionHandler 有下面4种        
    ThreadPoolExecutor.AbortPolicy
            抛出异常java.util.concurrent.RejectedExecutionException (和线程抛出异常不同,这个异常会影响到主线程)
    ThreadPoolExecutor.CallerRunsPolicy
            ThreadPoolExecutor来重试执行当前任务
    ThreadPoolExecutor.DiscardOldestPolicy
            取缔掉线程池中最后一个要执行的任务,并执行新传入的任务
     ThreadPoolExecutor.DiscardPolicy       
             不做任何动作











版权声明:本文为博主原创文章,未经博主允许不得转载。

ThreadPoolExecutor线程池

标签:

原文地址:http://blog.csdn.net/qq_21302985/article/details/47134053

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!