ExecutorService 详解

ThreadPoolExecutor
主要参数:
corePoolSize 线程池核心大小,当从没有任务到新任务进入时线程从0上涨到coreSize
maximumPoolSize 线程池queue满后新建线程到maxSize为止
keepAliveTime 线程无工作后如果大于coreSize则被回收
BlockingQueue<Runnable> workQueue 工作队列

ThreadFactory 线程工厂,一般用默认的

RejectedExecutionHandler 当队列满,线程池满后的异常状况处理,默认抛rejectexecutionException

 

 

核心代码:

 

 

中间这步比较特殊,是当前工作线程为空,但是还有任务在队列中则新建一个线程。

 

常用:

FixedThreadPool
corePoolSize=maximumPoolSize
使用LinkedBlockingQueue 无界,缓冲队列
无等待(idel)时间,如果队列为空立即返回
数目固定的线程池,当到达coresize后不会销毁,一直等待
使用问题:
固定的线程数,当有大量任务时,queue可能导致oom
cachedThreadPool
最小线程数0,最大线程数Integer.MAX
使用SynchronousQueue 无界 无缓冲 等待队列
元素添加后必须等待其被取出才能继续放入(可以认为 缓存值为1的阻塞队列)
当某个线程60秒未被使用则移除,(图一中workQueue.poll等待60秒,超时返回null,则图2中的循环退出,相应worker结束
使用问题:
当前面线程没有结束时,会一直创建新线程一直到Integer.MAX,然后queue进入等待
一般情况线程数太多会句柄溢出,内存溢出
线程池伸缩会很厉害,极限范围0—Integer.MAX
适用于快速失败的情况

 

 

猜你喜欢

转载自tonydark01.iteye.com/blog/2363823