Open chengfengjie opened 6 years ago
ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
参数说明:
corePoolSize
prestartCoreThread()
maximumPoolSize
workQueue
LinkedBlockingQueue
keepAliveTime
unit
TimeUnit
ArrayBlockingQueue
handler
SynchronousQueue
Integer.MAX_VALUE
Executors.newCachedThreadPool()
PriorityBlockingQueue
AbortPolicy
RejectedExecutionException
DiscardOldestPolicy
DiscardPolicy
一个创建线程池的构造器
参数说明:
corePoolSize
: 线程池中所保存的核心线程数。线程池启动后默认是空的,只有任务来临时才会创建线程以处理请求。prestartCoreThread()
方法可以在线程池启动后既启动所有核心线程以等待任务。maximumPoolSize
: 线程池允许创建的最大线程数。当workQueue
使用无界队列时(如:LinkedBlockingQueue
),此参数无效。keepAliveTime
: 当前线程池线程总数大于核心线程数时,终止多余的空闲线程的时间。unit
:keepAliveTime
的时间单位,可通过TimeUnit
获取workQueue
: 工作队列,如果当前线程池达到狠心线程数(corePoolSize
),且当前线程都处于活动状态,则将新加入的任务放到此队列中。下面几个常用的:ArrayBlockingQueue
: 基于数组结构的有界队列,此队列按FIFO原则对任务进行排序。如果队列满了还有任务进来,则调用拒绝策略。LinkedBlockingQueue
:基于链表结构的无界队列,此队列按FIFO原则对任务进行排序。因为它是无界的,根本不会满,所以采用此队列后线程池将忽略拒绝策略(handler
)参数;同时还将忽略最大线程数(maximumPoolSize
)等参数。SynchronousQueue
: 直接将任务提交给线程而不是将它加入到队列,实际上此队列是空的。每个插入的操作必须等到另一个调用移除的操作;如果新任务来了线程池没有任何可用线程处理的话,则调用拒绝策略。其实要是把maximumPoolSize
设置成无界(Integer.MAX_VALUE
)的,加上SynchronousQueue
队列,就等同于Executors.newCachedThreadPool()
。PriorityBlockingQueue
: 具有优先级的队列的有界队列,可以自定义优先级;默认是按自然排序,可能很多场合并不合适。handler
: 拒绝策略,当线程池与workQueue队列都满了的情况下,对新加任务采取的策略。AbortPolicy
: 拒绝任务,抛出RejectedExecutionException
异常。默认值。DiscardOldestPolicy
:如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)。这样的结果是最后加入的任务反而有可能被执行到,先前加入的都被抛弃了。DiscardPolicy
: 加不进的任务都被抛弃了,同时没有异常抛出。