Java Concurrency in Practice 第二部分 结构化并发应用程序

任务执行
  • Executor框架将任务提交于执行策略解耦开来,同时还支持多种不同类型的执行策略。当需要创建线程来执行任务时,可以考虑使用Executor。要想在将引用程序分解为不同的任务获得最大的好处,必须定义 清晰的任务边界。某些应用程序中存在着比较明显的任务边界,而在其他一些程序中则需要进一步分析才能揭示出粒度更细的并行性。
取消与关闭
  • 在任务、线程以及应用程序等模块中的生命周期结束问题,可能会增加它们在设计和实现时的复杂性。java并没有提供某种抢占式的机制来取消操作或者终结线程。相反,它提供了一种协作式的中断机制来实现取消 操作,但这要依赖于如何构建取消操作的协议,以及能否始终遵循这些协议。通过使用FutureTask和Executor框架,可以帮助我们构建可取消的任务和服务。
线程池的使用
  • 在任务与执行策略之间的隐性耦合
  • 对于并发执行的任务,Executor框架是一种强大且灵活的框架。它提供了大量可调节的选项,例如创建线程和关闭线程的策略,处理队列任务的策略,处理过多任务的策略,并且提供了几个钩子方法来扩展它的行为。 然而,与大多数功能强大的框架一样,其中有些设置参数并不能很好地工作,某些类型的任务需要特定的执行策略,而一些参数组合则可能产生奇怪的结果。
图形用户界面应用程序
  • 所有GUI框架基本上都实现为但线程的子系统,其中所有与表现相关的代码都作为任务在事件线程中运行。由于只有一个事件线程,因此运行时间较长的任务会降低GUI程序的 响应性,所以应该放在后台线程中运行,在一些辅助类中提供了对取消、进度指示以及完成指示的支持,因此对与执行时间较长的任务来说,无论在任务中包含了GUI组建还是非GUI组建,在开发时都可以得到简化。