-
Notifications
You must be signed in to change notification settings - Fork 21
线程池参数的最佳讲解
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
核心池大小(corePoolSize),即固定大小,设定好之后,线程池的稳定峰值,达到这个值之后池的线程数大小不会释放。
最大处理线程池数(maximumPoolSize),当线程池里面的线程数超过corePoolSize,小于maximumPoolSize时会动态创建与回收线程池里面的线程池资源。
线程池的运行机制:
举个栗子。假如有一个工厂,工厂里面有10个人,每个工人同时只能做一件事情。因此只要当10个工人中有工人是空闲的,来了任务就分配给空闲的工人做;当10个工人都有任务时,如果还来任务,就把任务进行排队等待。 如果说新任务数目增长的速度远远大于工作做任务的速度,那么此时工厂的主管可能就需要采取补救措施了,比如重新招4个工人进来;然后就将任务分配给这4个刚招进来的工人处理。
如果说这14个工人做任务的速度还是不够,此时工厂主管就要考虑不再接受新的任务或者抛弃前面的一些任务了。当这14个工人当中有人空闲时,而新任务增长的速度又比较缓慢,工厂主管就要考虑辞掉4个临时工了,只保持原来10个工人,比较额外的工人是需要花费的。 而这个栗子中永远等待干活的10个工人机制就是workerQueue。这个栗子中的corePoolSize就是10,而maximumPoolSize就是14(10+4)。也就是说corePoolSize就是线程池的大小,maximumPoolSize在我看来就是一种线程池任务超过负荷的一种补救措施,即任务量突然过大时的一种补救措施。再看看下面图好好理解一下。工人永远在等待干活,就像workerQueue永远在循环干活一样,除非,整个线程池停止了。
相比new Thread,Java提供的四种线程池的好处在于: a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。 b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 c. 提供定时执行、定期执行、单线程、并发数控制等功能。