ThreadPoolExecutor
首先看看ThreadPoolExecutor的构造函数,ThreadPoolExecutor提供了几个构造函数,我们先来参数最全构造函数的含义。
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueueworkQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间 unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的缓冲队列 handler: 线程池对拒绝任务的处理策略1,首先前四个参数共同负责线程的创建和销毁。
2,线程池利用队列来保存等待执行的任务。其中包括无界队列、有界队列和同步移交。
newFixedThreadPool 和 newSingleThreadExecutor 在默认情况使用的是无界队列LinkedBlockingQueue.如果任务持续快速的到达,超出了线程池的处理速度,那队列将会无限制的增大。
更稳妥的方式是使用有界队列。但有界队列引出的问题是队列填满后,新的任务怎么处理?这里引出饱和策略,将在3中说明有哪些饱和策略。
对于非常大或者无界的线程池,可以使用SynchronousQueue来避免任务排队,以及直接将任务从生产者移交到工作者线程。SynchronousQueue不是一个真正的队列,它主要是一种在线程之间进行移交的机制。要将元素放进SynchronousQueue中必须有另一个线程等待接受该任务。如果没有线程等待,并且线程池大小小于线程池的最大值,则创建一个新的线程。否则根据饱和策略来处理。使用直接移交更加的高效,因为任务会直接移交给执行他的线程,而不是放到队列中,由他的工作线程从队列中提取任务。只有当线程池是无界或饱和策略可以拒绝任务时,SynchronousQueue才有实际价值。
3,饱和策略
“中止”策略是默认的饱和策略,该策略会抛出RejectedExecutionException.
调用者运行策略实现了一种调节机制,既不会抛弃任务,也不会抛出异常,而是将任务回退到调用者。