GUI应用程序
1.GUI是单线程化的
《1》创建了一个事件派发线程专门处理gui事件2.短期的GUI任务
《2》容易产生界面假死的现象
《3》SwingUtilties.isEventDispatcherThread判断是否在事件分派线程中被调用
《4》SwingUtilties.invokeAndWait,使得runnable任务在在事件分派线程中执行,并且阻塞当前线程(只能在非GUI线程中调用)
《5》事件分派线程类似一个单线程化的executor
《1》短期的任务可以吧全部动作留在事件线程中完成,耗时较长的任务则应该吧负载分压都另一个线程中3.耗时的GUI任务
《2》fierxx方法不会提交到事件线程队列,而是执行对应的事件监听器,所以只能在事件线程中调用
《1》使用其他线程来执行耗时的任务,并将任务执行完后把相关的界面更新任务提交给事件分派线程4.共享数据模型:
《2》使用Future的cancel方法并且把参数ifmayinterrupte设置为true,如果执行的任务是可以可以相应中断的,(如在任务执行的过程中适时检查当前线程的中断状态),那么久可以对耗时任务进行取消
《3》进度与完成标识:
【1】重写futureTask中的的call和done方法,使得任务的执行和执行完成后执行指定操作(耗时任务在执行完成后才执行界面更新,需要提交给事件分派线程)
【2】重写Future中的setProgress方法使得任务进度以数字话显示。
【3】可取消任务的例子:使用Futruetask对象来运行任务,使得任务可获得结果和取消,在按钮开始执行任务后改变listener使得当前事件处理是取消任务,在任务完成后使得当前事件处理函数为执行计算操作。
《1》线程安全的数据模型:
【1】当数据模型支持精细的并发时,事件分派线程和后台线程就可以共享他,使得响应性问题不存在。但是数据模型的更新时必须生成事件以更新视图。,并且不能提供一致性的数据快照《2》分拆数据模型
【2】使用版本化数据模型,如copyonwritearraylist,该list在使用COWIterator作为迭代器,无法再迭代时修改原对象,而写操作则把当前list的array生成副本以供修改,修改完毕后吧原list指向数组的指针该为指向修改后的数组,以确保线程安全,使用于读操作多于写操作的情况。
【1】应用程序的模型既包含表现域又包含应用域则成为分拆数据模型(如tablemodel即用于存储显示数据,又受控于应用程序)
【2】表现模型被控制在事件分派线程当中,并且嵌入对共享数据模型的监听器,在共享模型更新时对变现模型通知。要注意的是:频繁更新情况或数据量大得情况底下,对模型的连续更新比更新整个数据模型高效(在实现多线程共线一个数据模型遇到困难的情况下适用)