什么是线程池
线程池(Thread Pool)是一种线程使用模式,提前创建一定数量的线程并进行复用,统一管理线程的创建、销毁和调度,从而:
- 降低线程创建和销毁的开销
- 提高程序响应速度
- 防止线程数量失控导致系统资源耗尽
线程池的核心参数
- Java中线程池的核心实现类是 ThreadPoolExecutor。
- public ThreadPoolExecutor(
- int corePoolSize,
- int maximumPoolSize,
- long keepAliveTime,
- TimeUnit unit,
- BlockingQueue<Runnable> workQueue,
- ThreadFactory threadFactory,
- RejectedExecutionHandler handler
- )
复制代码
- 线程池中长期存活的线程数量
- 即使空闲,也不会被销毁(除非设置允许回收)
- 作用:保证线程池的基本处理能力
- 线程池中允许存在的最大线程数量
- 当任务很多、队列已满时,才会创建新线程
- 作用:限制线程数量,防止资源耗尽
- 非核心线程空闲时,最多存活时间
- 超过该时间将被回收
- keepAliveTime 的时间单位
- 如:TimeUnit.SECONDS
队列特点LinkedBlockingQueue无界队列(可能 OOM)ArrayBlockingQueue有界队列SynchronousQueue不存任务,直接交给线程DelayQueue延时任务
- 用于创建线程
- 可自定义线程名、优先级、是否守护线程
- 方便排查问题、日志定位
策略行为AbortPolicy抛异常(默认)CallerRunsPolicy调用者自己执行DiscardPolicy直接丢弃任务DiscardOldestPolicy丢弃最早任务线程池的工作流程
flowchart TD A[提交任务] --> B{核心线程池是否满?} B -- 否 --> C[创建核心线程执行任务] B -- 是 --> D{任务队列是否满?} D -- 否 --> E[任务加入队列等待] D -- 是 --> F{线程池是否达到最大线程数?} F -- 否 --> G[创建非核心线程执行任务] F -- 是 --> H[执行拒绝策略]Executors创建常见线程池
- Java提供了Executors工具类,快速创建线程池(但生产环境不推荐直接使用)。
- ExecutorService pool = Executors.newFixedThreadPool(5);
复制代码
- 特点
- 线程数量固定
- 使用 无界队列 LinkedBlockingQueue
- 风险
- 适用场景
- SingleThreadExecutor(单线程池)
- ExecutorService pool = Executors.newSingleThreadExecutor();
复制代码- ExecutorService pool = Executors.newCachedThreadPool();
复制代码
- 特点
- 线程数不固定
- 空闲线程 60s 回收
- 使用 SynchronousQueue
- 风险
- ScheduledThreadPool(定时线程池)
- ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);
复制代码 HashTable, HashMap, ConcurrentHashMap 之间的区别
主要区别:
对比点HashtableHashMapConcurrentHashMap线程安全安全不安全安全实现方式数组+链表数组+链表+红黑树 (JDK 1.8)数组+链表+红黑树 + CAS + synchronized锁的粒度synchronized 整表加锁无锁分段锁/桶级锁 (锁定头节点)性能最差最好高并发下最好允许 key 为 null不允许允许 1 个不允许允许 value 为 null不允许允许不允许是否推荐使用不推荐推荐(单线程)推荐(并发)扩容机制整体扩容,扩容时阻塞所有操作整体扩容,扩容时阻塞所有操作分段 / 分桶扩容,不阻塞全部操作
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |