当前位置:网站首页>如何理解 swing 是非线程安全 (原创)
如何理解 swing 是非线程安全 (原创)
2022-08-02 20:29:00 【趣魂】
如何理解 swing 是非线程安全?
首先我们必须先掌握多线程操作
然后 就是多线程.执行时, run(){ .... 不能写 swing组件.属性修改或方法调用的代码 }
因为非常容易造成死锁 ,到时再改就晚了,要改非常多的代码
那么为什么swing 不设计成多线程呢?
从 opengl 引擎 说起吧,
c语言也可以开发gui程序 底层的图像引擎就是opengl等引擎
以最简单的平面对象为例,图像显示经过: 局部坐标 --> 重叠优化计算--> 显示器坐标
在复杂的程序中 ,经常是键盘或鼠标事件触发, 多线程同时修改一个或多个平面对象,
然后平面对象的改动又产生"其他行为","其他行为"又触发其他各种平面对象改动,依次传递
这样想来是不是经过很多环节后,程序已经不可推理,所以非常容易造成死锁
能不能用一种结构来 避免组件死锁呢?
答:可以, 只要引入统一事件队列即可!
EventQueue.invokeLater
理解为什么统一事件队列可以避免swing死锁?
1) 数据--> 组件::
多线程, 修改模型数据 -->调用统一事件队列, 添加事件{改动swing组件样式 }
-- 这样所有事件 都会在统一事件队列中依次被执行, 串行执行
-- 如果不添加到统一事件队列,就会导致组件被并发调用,产生死锁可能
2) 组件 --> 数据
1. 从系统事件-->组件拦截-->事件响应
>组件.添加影响事件(改动数据的行为)
也就是组件.添加 (系统事件 ,触发行为 )
2. ***组件是不可能自己先动的,要动也是数据先动,然后组件样式才会受到影响***
每次修改组件数据都要调用事件队列 ,写法很麻烦怎么办?
1. 建议用lambda表达式简化
EventQueue.invokeLater(()->{
swing 改变的代码都写在此处
});
//肯定比下列写法简单
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
... ...
} catch (Exception e) {
e.printStackTrace();
}
}
});
2. 尽量批量修改swing状态,不要一个组件一个组件地改
边栏推荐
- callback prototype __proto__
- postgresql autovaccum自动清理
- 有效解决MySQL报错:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO/YES)
- 网上那么多教人赚钱的方法,但是你实际上是靠什么赚钱的呢?
- 《分布式微服务电商》专题(一)-项目简介
- Implement fashion_minst clothing image classification
- 模板的进阶
- iframe------------frame-
- 开关、电机、断路器、电热偶、电表接线图大全
- 【目标检测】YOLOv5:640与1280分辨率效果对比
猜你喜欢

OP analysis and design

特拉维夫大学 | Efficient Long-Text Understanding with Short-Text Models(使用短文本模型进行高效的长文本理解)

【实战 已完结】WPF开发自动化生产管理平台

太魔人招新啦|快来加入我们吧!

对话亚洲高校首个博士论文奖-裘捷中丨KDD2022

Use the TCP protocol, we won't lost package?

接口测试常用工具及测试方法(入门篇)

Informatics orsay a tong (1258: 【 9.2 】 digital pyramid)

成为黑客不得不学的语言,看完觉得你们还可吗?

Li Mu hands-on learning deep learning V2-bert and code implementation
随机推荐
Helm基础知识
信息系统项目管理师必背核心考点(五十八)变更管理的主要角色
数据库分析与优化
Golang source code analysis: time/rate
2022年金九银十,Android面试中高频必问的问题汇总
[21 Days Learning Challenge] Bubble Sort and Insertion Sort
信息学奥赛一本通(1260:【例9.4】拦截导弹(Noip1999))
什么是乙二醇二乙酸酯(EGDA)?
pytorch的tensor创建和操作记录
.NET性能优化-你应该为集合类型设置初始大小
ALV concept explanation
C# Barrier class
DataGrip 安装教程 详细版
9,共模抑制比一-不受输入信号中共模波动的影响。【如何分析共模CM抑制比。】
The five classification of software testing
STP生成树协议
setup语法糖 defineProps defineEmits defineExpose
APP自动化uiautomator2获取toast
奥特学园ROS笔记--7(289-325节)
The Orsay in Informatics (1256: Bouquet for Algernon)