小郁闷中的大智慧
来源:互联网 发布:java float 比较 编辑:程序博客网 时间:2024/04/26 10:46
昨天写程序的时候碰到个很神的问题。代码如下:
这代码有个神奇的问题:偶尔能画出直线来,偶尔又画不出直线来。这就搞笑了,按道理说,程序的执行是具有确定性的,怎么会偶尔能画偶尔又不能画呢?
把代码发给同门师兄弟,一起研究,4个脑袋转了将近1个多小时还是没有解决。后来只能去Java的官网上看下drawLine的样例程序,把代码改了下:
线被顺利画出来。这是为什么呢?后来有个师弟在painComponent中设了个断点,Debug了一下,原因一下子就出来了:
原来,一般的Java程序默认是有两种线程在运行的,一种是用户线程,就是从main那里开始执行的线程,另一种是守护线程。
在错误的程序中,drawLine是在用户线程中运行的,即主线程。而对用户界面的绘制则是在守护线程中绘制的。因此则可能出现如下两种情况:
一,主线程跑得更快一些,因此drawLine先运行完,然后用户界面的绘制线程后运行的时候就把drawLine画出的线擦掉了。所以截面上啥也没。
二,主线程跑得慢一些,用户界面绘制线程跑得快一些,先完成用户界面绘制的初始化工作,然后drawLine再画线,所以直线就出来了。
修改后的程序解决了这一问题,把drawLine放到paintComponent中去,这个函数是在用户绘制界面线程中的,是事件触发式的,也就是每次界面初始化或者窗口改变的时候就会被调用。这样一定是界面初始化先进行,drawLine后进行,保证线不会被覆盖掉。
- 小郁闷中的大智慧
- 小动物大智慧
- 小故事大智慧
- 小问题,大智慧
- 小故事大智慧
- 小幽默大智慧
- 小故事大智慧
- 小常识,大智慧
- 小知识,大智慧!
- 小问题大智慧
- 小想法大智慧
- 小智慧,大感动
- 小生活,大智慧
- 小变量,大智慧
- 大智慧小问题
- 小知识大智慧
- 小知识 大智慧
- 小例子大智慧2--C#中的多态Polymorphism
- php下的后退表单内容保存问题
- ShellExecute函数中nShowCmd参数的值
- 向其他进程注入代码的三种方法
- s3c2410的ds18b20驱动(基于linux-2.6.24.4内核)
- 利用数学方法来大大降低一个逻辑判断实现的难度的例子
- 小郁闷中的大智慧
- asp.net生成图片验证码的类二
- Sql2000和Sql2005共存安装
- asp.net中ContentType属性
- 在MySQL中显示中文的方法
- Linux 2.6.24.4移植到S3C2410(nano2410)之:RTC
- Apache 1.3.* vs 2.0.* vs 2.2.*
- 初探java内存机制
- 利用包commons-fileupload-1.2.jar实现页面的附件上传