多线程并发实践_笔记_第九章

GUI应用程序
1.GUI是单线程化的
《1》创建了一个事件派发线程专门处理gui事件
《2》容易产生界面假死的现象
《3》SwingUtilties.isEventDispatcherThread判断是否在事件分派线程中被调用
《4》SwingUtilties.invokeAndWait,使得runnable任务在在事件分派线程中执行,并且阻塞当前线程(只能在非GUI线程中调用)
《5》事件分派线程类似一个单线程化的executor
2.短期的GUI任务
《1》短期的任务可以吧全部动作留在事件线程中完成,耗时较长的任务则应该吧负载分压都另一个线程中
《2》fierxx方法不会提交到事件线程队列,而是执行对应的事件监听器,所以只能在事件线程中调用
3.耗时的GUI任务
《1》使用其他线程来执行耗时的任务,并将任务执行完后把相关的界面更新任务提交给事件分派线程
《2》使用Future的cancel方法并且把参数ifmayinterrupte设置为true,如果执行的任务是可以可以相应中断的,(如在任务执行的过程中适时检查当前线程的中断状态),那么久可以对耗时任务进行取消
《3》进度与完成标识:
【1】重写futureTask中的的call和done方法,使得任务的执行和执行完成后执行指定操作(耗时任务在执行完成后才执行界面更新,需要提交给事件分派线程)
【2】重写Future中的setProgress方法使得任务进度以数字话显示。
【3】可取消任务的例子:使用Futruetask对象来运行任务,使得任务可获得结果和取消,在按钮开始执行任务后改变listener使得当前事件处理是取消任务,在任务完成后使得当前事件处理函数为执行计算操作。
4.共享数据模型:

《1》线程安全的数据模型:
【1】当数据模型支持精细的并发时,事件分派线程和后台线程就可以共享他,使得响应性问题不存在。但是数据模型的更新时必须生成事件以更新视图。,并且不能提供一致性的数据快照
【2】使用版本化数据模型,如copyonwritearraylist,该list在使用COWIterator作为迭代器,无法再迭代时修改原对象,而写操作则把当前list的array生成副本以供修改,修改完毕后吧原list指向数组的指针该为指向修改后的数组,以确保线程安全,使用于读操作多于写操作的情况。
《2》分拆数据模型
【1】应用程序的模型既包含表现域又包含应用域则成为分拆数据模型(如tablemodel即用于存储显示数据,又受控于应用程序)
【2】表现模型被控制在事件分派线程当中,并且嵌入对共享数据模型的监听器,在共享模型更新时对变现模型通知。要注意的是:频繁更新情况或数据量大得情况底下,对模型的连续更新比更新整个数据模型高效(在实现多线程共线一个数据模型遇到困难的情况下适用)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值