线程池构造参数分析

ThreadPoolExecutorjava

首先看看ThreadPoolExecutor的构造函数,ThreadPoolExecutor提供了几个构造函数,咱们先来参数最全构造函数的含义。函数

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)

corePoolSize: 线程池维护线程的最少数量 
maximumPoolSize:线程池维护线程的最大数量 
keepAliveTime: 线程池维护线程所容许的空闲时间 
unit: 线程池维护线程所容许的空闲时间的单位 
workQueue: 线程池所使用的缓冲队列 
handler: 线程池对拒绝任务的处理策略spa

1,首先前四个参数共同负责线程的建立和销毁。线程

2,线程池利用队列来保存等待执行的任务。其中包括无界队列、有界队列和同步移交。code

newFixedThreadPool 和 newSingleThreadExecutor 在默认状况使用的是无界队列LinkedBlockingQueue.若是任务持续快速的到达,超出了线程池的处理速度,那队列将会无限制的增大。队列

更稳妥的方式是使用有界队列。但有界队列引出的问题是队列填满后,新的任务怎么处理?这里引出饱和策略,将在3中说明有哪些饱和策略。同步

对于很是大或者无界的线程池,能够使用SynchronousQueue来避免任务排队,以及直接将任务从生产者移交到工做者线程。SynchronousQueue不是一个真正的队列,它主要是一种在线程之间进行移交的机制。要将元素放进SynchronousQueue中必须有另外一个线程等待接受该任务。若是没有线程等待,而且线程池大小小于线程池的最大值,则建立一个新的线程。不然根据饱和策略来处理。使用直接移交更加的高效,由于任务会直接移交给执行他的线程,而不是放到队列中,由他的工做线程从队列中提取任务。只有当线程池是无界或饱和策略能够拒绝任务时,SynchronousQueue才有实际价值。it

3,饱和策略io

“停止”策略是默认的饱和策略,该策略会抛出RejectedExecutionException.class

调用者运行策略实现了一种调节机制,既不会抛弃任务,也不会抛出异常,而是将任务回退到调用者。

相关文章
相关标签/搜索