Executors
Executors是java自带的线程池。Executors 里面默认提供的几个线程池是有一些弊端的,如果是不懂多线程、或者是新手直接盲目使用,就可能会造成比较严重的生产事故。
Executors.newFixedThreadPool(10);
Executors.newSingleThreadExecutor();
Executors.newScheduledThreadPool(10);
Executors.newCachedThreadPool();
FixedThreadPool 和 SingleThreadPool
第一个,FixedThreadPool 和 SingleThreadPool 中,阻塞队列长度是Integer.Max_Value,一旦请求量增加,就会堆积大量请求阻塞在队列中,可能会造成内存溢出的问题。
Executors的FixedThreadPool方法内部。
newFixedThreadPool里面有个队列,阻塞队列长度是Integer.Max_Value,所以一旦请求量增加,就会堆积大量请求阻塞在队列中,可能会造成内存溢出的问题。
SingleThreadPool方法同理。
CachedThreadPool 和 ScheduledThreadPool
CachedThreadPool 和 ScheduledThreadPool 中最大线程数量是Integer.Max_value,一旦请求量增加,导致创建大量的线程,使得处理性能下降。甚至可能会出现宕机的问题。
Executors的CachedThreadPool 方法内部。
ScheduledThreadPoolExecutor内部中最大大线程数量是 Integer.Max_value,所以一旦请求量增加,导致创建大量的线程,使得处理性能下降。甚至可能会出现宕机的问题。
ScheduledThreadPool方法同理。
ThreadPoolExecutor
为了避免这类问题出现,我们可以直接实例化 ThreadPoolExecutor,然后自己设置参数的值,从而确保线程池的可控性。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(8,
16,
15,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(15),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
参数说明:
第一个参数:指定了线程池中的线程数量,它的数量决定了添加的任务是开辟新的线程去执行,还是放到workQueue任务队列中去;
第二个参数:指定了线程池中的最大线程数量,这个参数会根据你使用的workQueue任务队列的类型,决定线程池会开辟的最大线程数量;
第三个参数:当线程池中空闲线程数量超过第一个参数时,多余的线程会在多长时间内被销毁;
第四个参数:第三个参数的单位
第五个参数:任务队列,被添加到线程池中,但尚未被执行的任务;它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种;
第六个参数:线程工厂,用于创建线程,一般用默认即可;
第七个参数:拒绝策略;当任务太多来不及处理时,如何拒绝任务;