发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 SOA

关于线程使用中的几个疑问,请教大家!

2006-01-09 16:13
赞助商链接

最近自己在写个JAVA游戏,其中对判断何时需要线程同步的问题,很是困惑,具体是这样的:

1. 当我想更新Jpanel面板时(在显示动画的主线程中调用repaint()),repaint()方法是否是立刻返回(即:实际更新操作是令开一个绘画的线程,以执行面板的paintComponent()方法)?还是repaint()方法自身去调用paintComponent()方法,然后等其执行完后才返回的?如果repaint()方法是立马返回的,即另外开一个线程来执行更新的话,那我在paintComponent()方法中要访问的对象(同时在调用repaint()方法的主动画线程中又要更新其状态时),应该做同步处理吧?如果不是的话,就不必做同步处理了。

2. JAVA中的事件处理机制是否也是线程级别的,举个例子:如果我在一个显示动画的主线程中要读一个对象的属性,而我在键盘上按一个键又能修改这个对象的属性,像这种情况也需要进行线程同步吧?

就这么多了,望高人指点一二,在下感激不尽!

2006-01-10 17:26

>判断何时需要线程同步的问题
如果多个线程可能同时通过一个类的一个方法修改同一个资源:如内存中状态(也就是一个对象中字段属性)

注意是修改,包括删除和更新,读取是没有关系。第一个问题好像应该做同步;第2个主要可能产生脏读,看你业务关系大不大。

2006-01-10 20:59

感谢楼上朋友给予的帮助,经过自己的一些测试,事情又有了一些新发现,我的理解如下:

在JAVA SWING的事件驱动程序中,总是存在着一个SWING事件调度线程,由它来依次管理那些捕获的事件,所以如果捕获了一个键盘事件,那么接下来在keyPressed(KeyEvent e)中执行的代码应该是由SWING事件调度线程来执行的,即事件处理代码所在的线程和程序中的main(String[] args)方法所在的主线程是两个不同的线程。

当我在一个显示动画的线程中调用repaint()方法想更新Jpanel面板的外貌时,repaint()方法是立马就返回的,而不是等面板的paintComponent()执行完后才返回的,我想面板的实际更新操作,即paintComponent()方法的调用是由SWING事件调度线程来执行的,而不是在显示动画的主线程中执行的,现在就有了一个新的问题,假设动画线程的执行顺序如下:

while(true)
{
1.计算物体应到达的位置;
2.调用repaint()方法在Jpanel上显示在该位置上的物体;
3.sleep()一段时间(做一些帧同步的处理);
}

我想要的结果是动画的显示很平滑,而我发现有时物体的移动会突然变快,然后又恢复正常的速度!所以根据上面我对线程的理解,是不是有这种意外情况:因为repaint()方法是立刻返回的,所以不管我要在面板上画的物体有多复杂,都不会阻塞动画显示的主线程,物体在面板上的实际显示是由swing事件调度线程来执行的,即面板的paintComponent()方法不是在repaint()方法内部调用的,那么我们现在就有两个线程参与此事了(动画显示的主线程和swing事件的调度线程),因为我想要的执行结果是1执行完后马上执行2;那么有没有这种可能:123都执行完后,SWING事件调度线程还没有调用Jpanel的paintComponent()方法,而动画显示的主线程又进入新的循环,再次执行1,然后事件调度线程才执行面板的更新操作,如果是这样的话,那么物体的移动就会突然变快,原因是跳过了一帧动画的显示。

不知道以上我的理解对不对,还有应该怎样解决动画显示突然变快的情况?望高手给以赐教!


2006-01-11 16:45

>有应该怎样解决动画显示突然变快的情况?望高手给以赐教
具体原因很难帮你分析,其实这也是线程编程的一个难点,线程并不是我们预料那样平滑一直运行时,如果有其他权限级别比它高的线程,那么它可能被暂停或者等待很长一段时间再启动,这些都是我们无法控制的,是CPU自己算法决定的。


赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com