ThreadPoolExecutor JDK线程池

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.创建新线程执行  继续添Task....
          >  corePoolSize      workQueue已经放满    maximumPoolSize也装满,新提交任务由Handler处理
                                                                                     (构造方法的最后一个参数)  
    Task未新添加...渐渐执行完毕
          多余线程空闲时间超过keepAliveTime时,会关闭这部分线程,直到线程数量为 corePoolSize


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


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

你可能感兴趣的:(java,基础)