java线程池及阻塞队列记录
corePoolSize:指定了线程池中的线程数量,它的数量决定了添加的任务是开辟新的线程去执行,还是放到*workQueue任务队列中去;*
maximumPoolSize:指定了线程池中的最大线程数量,这个参数会根据你使用的*workQueue任务队列的类型,决定线程池会开辟的最大线程数量;*
keepAliveTime:当线程池中空闲线程数量超过corePoolSize时,多余的线程会在多长时间内被销毁;
unit:keepAliveTime的单位
workQueue:任务队列,被添加到线程池中,但尚未被执行的任务;它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种;
threadFactory:线程工厂,用于创建线程,一般用默认即可;
handler:拒绝策略;当任务太多来不及处理时,如何拒绝任务;
首先搜集了下两种阻塞队列的差异:
ArrayBlockingQueue:内部维护了一个数组;
在初始化的时候,必须传入一个容量大小的值
LinkedBlockingQueue:内部维护的是一个链表结构,在生产和消费的时候,需要创建Node对象进行插入或移除,大批量数据的系统中,其对于GC的压力会比较大;
初始化时有默认的容量大小为:Integer.MAX_VALUE,当然也可以传入指定的容量大小,所以实际上也不是无限的长度
两种经典的线程池构造举例:
1.无界阻塞线程池
说明:10个线程执行,超过的任务放到阻塞队列,可能会引发资源耗尽 ExecutorService pool = new ThreadPoolExecutor(10, 10, 500, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>())
2.有界阻塞线程池
说明:如果有界队列未满,维持在10个线程以内,否则线程数增长,直至到达100个后拒绝
ExecutorService pool = new ThreadPoolExecutor(10, 100, 500, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(20))