您的位置:首页 > 编程语言 > Java开发

《JAVA并发编程实践》学习笔记(第八.九章)

2016-04-08 23:49 459 查看
第8章 应用线程池
8.1 任务与执行策略间的隐形耦合

一些任务具有这样的特征:需要或者排斥某种特定的执行策略。对其他任务具有依赖性的任务,就会要求线程池足够大,来保证它所依赖任务不必排队或者不被拒绝;采用线程池的任务需要顺序地执行。把这些需求都写入文档,这样将来的维护者就不会使用一个与原先相悖的执行策略,而破坏安全性或活跃度了。

8.1.1线程饥饿死锁

在线程池中如果一个任务依赖于其他任务的执行,就可能产生死锁。

线程饥饿死锁(thread starvation deadlock),满足以下叙述就会发生:只要吃池任务开始了无限期的阻塞,其目的是等待一些资源或条件,此时只有另个一池任务的活动才能使那些条件成立,比如等待返回值或者另一个任务的边界效应。除非保证这个池足够大,否则会繁盛线程饥饿死锁。

8.2 定制线程池的大小

如果线程池过大:线程对稀缺的CPU和内存资源的竞争,会导致内存的高使用量,还可能耗尽资源。如果过小,由于存在很多可用的处理器资源却未在工作,会对吞吐量造成损失。

8.3 配置ThreadPoolExecturtor

8.3.1 线程的创建与销毁

核心池大小(corepool size)、最大池的大小(maximum pool size)和存活时间(keep-alivetime) 共同管理者线程的创建于销毁。核心线程池大小是目标的大小。

8.3.2管理队列任务

8.3.4 线程工厂

无论怎样,线程池需要创建一个线程,都要通过一个线程工厂(trhead factory).

每个迭代彼此独立,并且完成循环体重每个迭代的工作,意义都足够重大,足以弥补管理一个新任务的开销时,这个顺序循环是合适并行化的。

第9章 GUI应用程序
几乎所有的GUI工具集都实现为单线程化子系统(single-threaded),意味着所有GUI的活动都被限制在一个单独的线程中,这其中就包括Swing和SWT.

9.1 为什么GUI是单线程化的

9.1.1顺序事件处理

顺序任务处理不利的一面是,如果一个任务的执行要花费很长时间,其他任务也必须要等到它结束。

9.1.2 Swing中的线程限制

Swing的单线程规则:Swing的组件和模型只能在事件分派线程中被创建,修改和请求。

9.2 短期的GUI任务

9.3.2 进度和完成标识

使用Future表现一个耗时任务,可以极大地简化取消的实现。

9.4.1 线程安全的数据模型

只要阻塞不过度影响想影响,多线程操作数据的问题就可以通过线程安全的数据模型来解决。

9.4.2 分拆数据模型

如果一个数据模型必须被多个线程共享,而且实现了一个线程安全模型的尝试却由于阻塞、一致性或者复杂度等原因而失败,这时可以考虑运用分拆模型设计。

9.5 其他形式的单线程子系统

线程限制不仅仅限制在GUI系统:无论何时,它都可以用作实现单线程化子系统的便利工具。

总结

GUI框架几乎都是作为单线程化子系统实现的,所有与表现相关的代码都作为任务在一个事件过程中运行。因为只有唯一一个过程,耗时任务会损害响应性,所以它们应该在后台线程中运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: