Java并发编程 笔记:图形用户界面应用程序

xiaoxiao2021-02-28  33

为什么GUI线程是单线程的

之前有人尝试过多线程GUI框架,最后被死锁弄死了,因为GUI元素众多,如果每个GUI元素都需要线程安全,很容易有两个线程交叉持有不同GUI元素的锁而造成死锁。

所以swing中使用线程封闭机制(把所有代码放一个线程中执行)。所有GUI事件都在一个事件处理线程中执行。调用GUI元素的代码前首先检查当前线程是不是GUI事件线程,如果不是直接抛异常。swing也提供了多个util类来方便使用线程封闭机制,如isEventDispatchThread判断当前线程是否事件线程,invokeLater将任务提交到事件线程里

线程封闭机制的实现不是很复杂,可以利用singleThreadExcutor来实现

短时间GUI任务

如果任务时间很短,且多是GUI操作,则建议把所有的操作都放GUI线程里执行

长时间GUI任务

如果任务时间较长(数据库独写,网络请求,文件操作),建议将任务放单独线程执行,尽快交出GUI线程的控制权

但很多时候,长时间任务完成时需要更新GUI,中间需要支持进度条和取消,可以封装一个专门的backgroundtask任务类,该类的oncopletion和onprogress在GUI线程中运行,run方法在后台线程中运行,利用Future的取消来取消任务

共享数据模型

如果GUI线程的模型和后台线程共用,则需要调用线程安全的数据模型

转载请注明原文地址: https://www.6miu.com/read-1950072.html

最新回复(0)