如何理解 swing 是非线程安全 (原创)

如何理解 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状态,不要一个组件一个组件地改
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值