Java并发编程实战(二):Executor框架与线程池实践指南
Executive Summary
核心观点(金字塔原理)
结论先行: Executor框架将任务提交与执行策略解耦,是构建结构化并发应用的核心工具,配合协作式中断机制实现可靠的任务取消与关闭。
支撑论点:
- 任务执行:Executor框架支持多种执行策略,清晰的任务边界定义是获取最大并行性收益的关键
- 生命周期管理:Java采用协作式中断机制,通过FutureTask和Executor实现可取消的任务和服务
- 线程池配置:合理的参数配置(线程数、队列策略、拒绝策略)对系统性能至关重要
SWOT 分析
| 维度 | 分析 |
|---|---|
| S 优势 | 任务与执行策略解耦;丰富的可配置选项;内置钩子方法支持扩展;框架成熟稳定 |
| W 劣势 | 某些参数组合可能产生异常行为;特定任务类型需要特定执行策略;学习曲线较陡 |
| O 机会 | 高并发服务端应用;批量任务处理;异步任务调度;资源池化管理 |
| T 威胁 | 配置不当导致性能问题;任务边界定义不清引发死锁;资源耗尽风险 |
适用场景
- 需要管理大量并发任务的服务端应用
- 后台批量数据处理任务
- GUI应用中的耗时操作异步处理
任务执行
- Executor框架将任务提交于执行策略解耦开来,同时还支持多种不同类型的执行策略。当需要创建线程来执行任务时,可以考虑使用Executor。要想在将引用程序分解为不同的任务获得最大的好处,必须定义 清晰的任务边界。某些应用程序中存在着比较明显的任务边界,而在其他一些程序中则需要进一步分析才能揭示出粒度更细的并行性。
取消与关闭
- 在任务、线程以及应用程序等模块中的生命周期结束问题,可能会增加它们在设计和实现时的复杂性。java并没有提供某种抢占式的机制来取消操作或者终结线程。相反,它提供了一种协作式的中断机制来实现取消 操作,但这要依赖于如何构建取消操作的协议,以及能否始终遵循这些协议。通过使用FutureTask和Executor框架,可以帮助我们构建可取消的任务和服务。
线程池的使用
- 在任务与执行策略之间的隐性耦合
- 对于并发执行的任务,Executor框架是一种强大且灵活的框架。它提供了大量可调节的选项,例如创建线程和关闭线程的策略,处理队列任务的策略,处理过多任务的策略,并且提供了几个钩子方法来扩展它的行为。 然而,与大多数功能强大的框架一样,其中有些设置参数并不能很好地工作,某些类型的任务需要特定的执行策略,而一些参数组合则可能产生奇怪的结果。
图形用户界面应用程序
- 所有GUI框架基本上都实现为但线程的子系统,其中所有与表现相关的代码都作为任务在事件线程中运行。由于只有一个事件线程,因此运行时间较长的任务会降低GUI程序的 响应性,所以应该放在后台线程中运行,在一些辅助类中提供了对取消、进度指示以及完成指示的支持,因此对与执行时间较长的任务来说,无论在任务中包含了GUI组建还是非GUI组建,在开发时都可以得到简化。