答案:会;
分析:
创建线程池方式有如下几种:
Executors.newFixedThreadPool(10);//LinkedBlockingQueue 无限加入队列 Executors.newScheduledThreadPool(10);//DelayedWorkQueue 队列如果满了,阻塞 Executors.newSingleThreadScheduledExecutor();//DelayedWorkQueue 队列如果满了,阻塞 Executors.newCachedThreadPool();//SynchronousQueue 队列如果满了,抛异常 Executors.newSingleThreadExecutor();//LinkedBlockingQueue 无限加入队列
本文以newFixedThreadPool为例,以下是jdk源码:
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler);}
参数说明:
- corePoolSize:核心线程数
- maximumPoolSize: 最大线程数
- keepAliveTime:线程指定时间内获取不到任务,则销毁
- unit:时间单位
- workQueue:任务队列
线程池工作原理图解:
LinkedBlockingQueue默认的最大任务数量是Integer.MAX_VALUE,非常大,可以理解为无限大吧;但是存在这种情况,当每个线程获取到一个任务后,执行时间比较长,导致workQueue里积压的任务越来越多,机器的内存使用不停的飙升,最后也会导致OOM。
原文地址:https://www.cnblogs.com/hujinshui/p/10342897.html
时间: 2024-11-05 00:42:13