面试常问:如何设置Java线程池大小?
✨什么是线程池?
线程池: 是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时尽可能重用这些线程而不是新建一个线程。
🌈线程池种类介绍
🌈线程池种类介绍——Executors
🌝newFixedThreadPool()
newFixedThreadPool():固定线程数的线程池
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
线程池特点:
- 核心线程数和最大线程数大小一样
- 没有所谓的非空闲时间,即keepAliveTime为0
- 阻塞队列为无界队列LinkedBlockingQueue
缺点
- 如果某任务执行时间过长,而导致大量任务堆积在阻塞队列中,或者说在某一时刻大量任务进来则会导致机器内存使用不断飙升,最终导致OOM
使用场景
newFixedThreadPool 适用于处理CPU密集型的任务,确保CPU在长期被工作线程使用的情况下,尽可能的少的分配线程,即适用执行长期的任务。
🌑newCachedThreadPool()
public static ExecutorService newCachedThreadPool() {