Java并发编程:线程池的使用方法和配置
93 浏览量
更新于2024-09-01
收藏 91KB PDF 举报
Java并发编程_线程池的使用方法详解
Java并发编程中,线程池的使用是非常重要的,下面我们将详细讲解线程池的使用方法。
一、任务和执行策略之间的隐性耦合
在Java并发编程中,Executor可以将任务的提交和任务的执行策略解耦,提高了代码的灵活性和可维护性。但是,这也带来了隐性耦合的风险。当任务之间存在依赖关系时,如果不小心处理,可能会导致死锁等问题。
1. 线程饥饿死锁
例如,将两个任务提交给一个单线程池,且两个任务之间相互依赖,一个任务等待另一个任务,则会发生死锁;表现为池不够。定义:某个任务必须等待池中其他任务的运行结果,有可能发生饥饿死锁。
2. 线程池大小
线程池的大小不仅仅取决于线程池本身,还受其他资源池的限制,如数据库连接池。如果每个任务都是一个连接,那么线程池的大小就受制于数据库连接池的大小。
三、配置ThreadPoolExecutor线程池
ThreadPoolExecutor是Java并发编程中最重要的线程池实现类。可以通过Executors的工厂方法返回默认的一些实现,也可以通过实例化ThreadPoolExecutor(..)自定义实现。
1. 通过Executors的工厂方法返回默认的一些实现
Executors提供了一些工厂方法,可以返回默认的一些ThreadPoolExecutor实现,如newFixedThreadPool、newCachedThreadPool等。
2. 通过实例化ThreadPoolExecutor(..)自定义实现
可以通过实例化ThreadPoolExecutor来自定义线程池的实现。例如,可以指定线程池的核心线程数、最大线程数、keepAliveTime等参数。
四、线程池的队列
线程池的队列是非常重要的,它决定了线程池如何处理任务。有两种类型的队列:无界队列和有界队列。
1. 无界队列
无界队列是指队列的大小可以无限扩张。例如,单例和固定大小的线程池用的就是这种队列。如果任务到达,线程池饱满,则任务在队列中等待。
2. 有界队列
有界队列是指队列的大小是固定的。如果新任务到达,队列满则使用饱和策略。
五、饱和策略
饱和策略是指当线程池饱满时,如何处理新任务。Java提供了四种饱和策略:
1. 终止Abort(默认):抛出异常由调用者处理。
2. 抛弃Discard:抛弃新任务。
3. 抛弃DiscardOldest:抛弃最旧的任务,注意:如果是优先级队列将抛弃优先级最高的任务。
4. CallerRuns:回退任务,有调用者线程自行处理。
六、线程工厂ThreadFactoy
线程工厂是ThreadPoolExecutor创建线程时调用的工厂。可以自定义线程工厂,implementsThreadFactory,可以定制该线程工厂的行为,如UncaughtExceptionHandler。
Java并发编程中的线程池使用是非常复杂的,需要充分考虑线程池的大小、队列类型、饱和策略等因素。只有通过合理的配置和使用线程池,才能发挥线程池的最大性能。
182 浏览量
2021-10-18 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
2020-08-28 上传
2020-08-29 上传
2020-08-29 上传
点击了解资源详情
weixin_38743481
- 粉丝: 696
- 资源: 4万+
最新资源
- SSM动力电池数据管理系统源码及数据库详解
- R语言桑基图绘制与SCI图输入文件代码分析
- Linux下Sakagari Hurricane翻译工作:cpktools的使用教程
- prettybench: 让 Go 基准测试结果更易读
- Python官方文档查询库,提升开发效率与时间节约
- 基于Django的Python就业系统毕设源码
- 高并发下的SpringBoot与Nginx+Redis会话共享解决方案
- 构建问答游戏:Node.js与Express.js实战教程
- MATLAB在旅行商问题中的应用与优化方法研究
- OMAPL138 DSP平台UPP接口编程实践
- 杰克逊维尔非营利地基工程的VMS项目介绍
- 宠物猫企业网站模板PHP源码下载
- 52简易计算器源码解析与下载指南
- 探索Node.js v6.2.1 - 事件驱动的高性能Web服务器环境
- 找回WinSCP密码的神器:winscppasswd工具介绍
- xctools:解析Xcode命令行工具输出的Ruby库