首页 > 应用开发 > Java > 大厂面试必问:如何设置Java线程池大小?
线程池: 是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时尽可能重用这些线程而不是新建一个线程。
newFixedThreadPool():固定线程数的线程池
线程池特点:
缺点
使用场景
newFixedThreadPool 适用于处理CPU密集型的任务,确保CPU在长期被工作线程使用的情况下,尽可能的少的分配线程,即适用执行长期的任务。
线程池特点:
缺点
CachedThreadPool允许创建的线程数量为 Integer.MAX_VALUE ,可能会创建大量线程,从而导致 OOM。使用场景
适用于并发执行大量短期的小任务。
SynchronousQueue是无界的,是一种无缓冲的等待队列
线程池特点
缺点
LinkedBlockingQueue 为无界队列,可能会导致OOM
使用场景
适用于串行执行任务的场景,一个任务一个任务地执行。
线程池特点
使用场景
周期性执行任务的场景,需要限制线程数量的场景
阿里巴巴Java开发手册禁止使用
Executors创建线程池,而是推荐
ThreadPoolExecutor来自定义线程池
corePoolSize 核心线程数,没达到核心线程数时,会创建新的线程。当达到核心线程数时,任务会进去队列
maximumPoolSize 最大线程数,可以为Integer.MAX_VALUE 21亿。当达到核心线程数且队列满了的时候,会去创建额外的线程来执行任务,最多不超过最大线程数
keepAliveTime 存活时间,当任务处理完成,额外的线程存活一段时间后,会自行销毁。空闲等待时间(该参数默认对核心线程无效,当 allowCoreThreadTimeOut手动设置为true时,核心线程超过存活时间后才会被销毁)
TimeUnit 空闲等待时间的单位
BlockingQueue :任务进来,如果核心线程数满了,则任务进入队列中等待。
ThreadFactory 线程创建工厂
RejectExecutionHandler 拒绝策略,当最大线程数满了并且队列也满了的时候,如果再有任务进来就会启用拒绝策略。
公式
设置的是最大线程数
如何判断是 CPU 密集任务还是 IO 密集任务?
CPU 密集型简单理解就是利用 CPU 计算能力的任务比如你在内存中对大量数据进行排序。
但凡涉及到 网络读取,文件读取这类都是 IO 密集型,这类任务的特点是 CPU 计算耗费时间相比于等待 IO 操作完成的时间来说很少,大部分时间都花在了等待 IO 操作完成上。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70000438/viewspace-2787987/ ,如需转载,请注明出处,否则将追究法律责任。