Java并发编程:线程池的使用方法和配置
88 浏览量
更新于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并发编程中的线程池使用是非常复杂的,需要充分考虑线程池的大小、队列类型、饱和策略等因素。只有通过合理的配置和使用线程池,才能发挥线程池的最大性能。
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
2021-10-18 上传
2020-08-28 上传
2020-08-29 上传
2020-08-29 上传
点击了解资源详情
weixin_38743481
- 粉丝: 698
- 资源: 4万+
最新资源
- ghaction-publish-ghpages:将内容发布到GitHub Pages
- HTML5 Video Speed Control-crx插件
- 人工智能实验2020年秋季学期.zip
- PyPI 官网下载 | vector_quantize_pytorch-0.4.0-py3-none-any.whl
- form:将您的Angular2 +表单状态保留在Redux中
- Tensorflow_practice:딥러닝,머신러닝
- Dijkstra.rar_matlab例程_matlab_
- 任何点复选框
- 人工智能写诗.zip
- Parstagram:使用私有存储服务器模仿Instagram
- mod-1白板挑战牌卡片sgharms测试webdev资金
- Slack Panels-crx插件
- PyPI 官网下载 | vectorian-0.9.2-cp38-cp38-macosx_10_9_x86_64.whl
- react-card-component:React卡组件Libaray
- 人工智能与实践 bilibili.zip
- Architecture-Website