ThreadPoolExecutor的几个参数理解

new ThreadPoolExecutor(

int coreSize,

int maxSize,

long time,int timeUnit,

BlockingQueue taskQueue,

ThreadFactory  threadFactory):

参数含义如下:

coreSize:核心线程数

maxSize :线程最大数

time,timeUnit:空闲线程超时时间,超时后线程销毁

taskQueue:存放任务的队列

threadFactory:创建线程的线程工厂

 

1.当线程池中的线程数没有达到coreSize时,提交一个任务,不论此时有没有线程处于空闲状态,则会创建一个新的线程!

2.当线程数达到coseSize时,此时在提交任务,如果有线程空闲,则执行任务,如果没有空闲,则放入taskQueue中等待被执行。

3.当taskQueue队列中放满任务时,如果此时所有的线程都处于执行任务期间,再次提交任务,则会创建一个新线程,用于执行队列中的任务,当线程数达到maxSize的时候,如果再次提交任务,如果任务队列已满,并且所有的线程处于活动期间,则提交任务失败,抛出RejectExecutionException.

 

总之,如果没有设置quitCore=true,核心线程不会被销毁,在线程数达到coreSize之前,每次提交任务都会创建新线程。

线程数达到coreSize后,提交任务会使用空闲线程执行,如果没有空闲线程,则会放到任务队列taskQueue中,等待被执行!

如果队列满了,所有coreSize线程都处于executing task的状态,则会创建一个新线程用于执行队列中的任务。

 

可以根据几个参数含有,设定具体场景的线程池,Executors中有几个常用的线程池如下:

FixedThreadPool(

          特点:1每一个线程都是核心线程,不设置quitCore=true时,每个线程都不会被销毁):

           new ThreadPoolExecutor(threadSize,threadSize,0,TimeUnit.Seconds,new LinkedBlockingQueue());

 

 

CachedThreadPool (

                特点:1.没有核心线程,所有线程空闲60秒后销毁

                           2.无边界,不管提交多少任务,都有线程去立刻执行,充分利用了SynchronousQueue容量为0的特点)

           new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.Seconds,new SynchronousQueue());

 

 

SingleThreadPool(

                     特点:只有一个核心线程,即按照任务提交的顺序,串行执行任务

              new ThreadPoolExecutor(1,1,0L,TimeUnit.Seconds,new LinkedBlockingQueue());

               

 

ScheduledThreadPool:

          特点是:核心线程数固定,无最大边界,非核心线程空闲即销毁,可延时执行任务

new ScheduledThreadPoolExecutor(coreSize,Integer.MAX_VALUE,0L,TimeUnit.Seconds,new DelayedWorkQueue());

 

 

 

 

你可能感兴趣的:(java)