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

第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框架几乎都是作为单线程化子系统实现的,所有与表现相关的代码都作为任务在一个事件过程中运行。因为只有唯一一个过程,耗时任务会损害响应性,所以它们应该在后台线程中运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值