今天聊一聊为什么不推荐使用jdk自带的Executors静态方法下创建线程池的方法,最常见的就是以下这四种:
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
核心线程数是,最大线程数为整型的最大值,队列大小为1,空闲保持时间60L
1. ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
创建一个指定工作线程数量的线程池。创建出来的核心线程和最大线程数为传入的指定的数量,队列长度为整形的最大值
2. ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
和上边一样,就是这个核心线程数为和最大线程数为1
3. ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。
4. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
前三种最长用,但是为什么不推荐用自带的方法创建线程池的,第一种方式假如同时有10000个任务,假如任务执行时间大于空闲保持时间那就要创建10000个线程去处理任务,此时就会非常
消耗CPU资源,第二种和第三种,假如任务量大的时候,绝大多数任务都会堆在队列中,非常的消耗内存,很容易OOM,所以日常开发中最好根据实际情况自己设置线程池参数,使用底层的:
ExecutorService threadPool=new ThreadPoolExecutor(2,5, 1L,TimeUnit.SECONDS, new LinkedBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());