小郁闷中的大智慧

昨天写程序的时候碰到个很神的问题。代码如下:

这代码有个神奇的问题:偶尔能画出直线来,偶尔又画不出直线来。这就搞笑了,按道理说,程序的执行是具有确定性的,怎么会偶尔能画偶尔又不能画呢?

把代码发给同门师兄弟,一起研究,4个脑袋转了将近1个多小时还是没有解决。后来只能去Java的官网上看下drawLine的样例程序,把代码改了下:

线被顺利画出来。这是为什么呢?后来有个师弟在painComponent中设了个断点,Debug了一下,原因一下子就出来了:

 

原来,一般的Java程序默认是有两种线程在运行的,一种是用户线程,就是从main那里开始执行的线程,另一种是守护线程。

在错误的程序中,drawLine是在用户线程中运行的,即主线程。而对用户界面的绘制则是在守护线程中绘制的。因此则可能出现如下两种情况:

一,主线程跑得更快一些,因此drawLine先运行完,然后用户界面的绘制线程后运行的时候就把drawLine画出的线擦掉了。所以截面上啥也没。

二,主线程跑得慢一些,用户界面绘制线程跑得快一些,先完成用户界面绘制的初始化工作,然后drawLine再画线,所以直线就出来了。

 

修改后的程序解决了这一问题,把drawLine放到paintComponent中去,这个函数是在用户绘制界面线程中的,是事件触发式的,也就是每次界面初始化或者窗口改变的时候就会被调用。这样一定是界面初始化先进行,drawLine后进行,保证线不会被覆盖掉。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值