java多线程-线程池
如何创建线程池?
有五种:
ThreadPoolExecutor的构造函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0 ) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null ) throw new NullPointerException(); this .corePoolSize = corePoolSize; this .maximumPoolSize = maximumPoolSize; this .workQueue = workQueue; this .keepAliveTime = unit.toNanos(keepAliveTime); this .threadFactory = threadFactory; this .handler = handler; } |
- corePoolSize :核心线程的数量
- maxmumPoolSize: 线程不够用时,最大的线程数
- workQueue:任务等待队列
- keepAliveTime:核心线程外的线程,不会立即被销毁,而是等待至keepAliveTime后,才被销毁
- ThreadFactory: 创建新线程
- handler:线程池的饱和策略
- AbortPolicy: 直接抛出异常,默认的策略
- CallRunsPolicy: 用调用者所在的线程来执行任务
- DiscardOldestPolicy: 丢弃队列中最靠前的任务,并执行当前任务
- DiscardPolicy: 直接丢弃任务
- 实现RejectedExecutionHandler接口的自定义handler
为什么使用线程池?
- 降低资源消耗:通过重复利用线程,降低创建线程和销毁线程的消耗
- 提高线程的可管理型:统一分配、调优和监控
线程池的状态:五种
线程池的大小如何选定?
- CPU密集型:线程数 = CPU核数 +1
- IO密集型:线程数 = CPU核数 *(1+平均等待时间/平均工作时间)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤