在Java程序中为每个动画使用Thread是否可以?

时间:2010-08-31 20:05:55

标签: java multithreading animation

我正在开发一个Java程序,它包含很多动画作为UI的一部分。每个动画都需要调用重绘方法才能使动画发生。我只是想知道为每个动画使用一个单独的线程是否很好编程,每个动画都会调用它们各自的重绘方法。

5 个答案:

答案 0 :(得分:2)

没有。或者是的,取决于你在做什么。

通常只有SwingEvent线程应该绘制到屏幕上,通常是为了响应repaint()。但是,为每个动画设置一个不同的线程以计算应为每个动画绘制的位图,但不绘制它,然后触发SwingEvent线程实际绘制它可能没问题。如果动画彼此同步,或者所涉及的计算量微不足道,则没有意义。

如果你有很多线程,那么性能会受到影响。我不知道你的申请会受到什么惩罚 - 如果你真的想知道,你将不得不进行试验。

请记住,多个线程编程会更复杂(与一个线程按顺序完成工作相比)并且拥有更多线程(超过CPU拥有的内核数量)几乎从不允许在给定时间内完成更多工作。

答案 1 :(得分:1)

不,因为所有这些线程的开销会使该过程效率低下。

答案 2 :(得分:1)

我假设你正在使用Swing?我不确定。

我建议阅读http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html,并在Swing中搜索有关线程的更多信息。通常,应该更新GUI的唯一线程应该是Event Dispatch线程,尽管有一些例外。

我认为使用线程很好,只需要求Event Dispatch线程更新你的UI,

    java.awt.EventQueue.invokeLater(new Runnable()
    {

        public void run()
        {
            //this codes runs on the event dispatch thread
        }
    });

答案 3 :(得分:0)

对于摆动,最好使用一个(或多个)javax.swing.Timer(s)。让计时器调用需要更新(动画)的所有组件上的重绘。您可以制作一个自定义计时器,让您添加/删除组件。但要小心所有涉及的线程。 (您不希望出现死锁/同步问题。)所有计时器都使用相同的线程进行等待,并在事件派发线程上运行代码。

答案 4 :(得分:0)

我知道我已经看到了一些做这件事的框架,请查看JGoodies动画库;我认为就是我看到的地方。

一般来说,想法是最小化线程数量(假设动画更新很快,比如切换到已经加载的图片),你可以创建一个动画客户端界面,单个动画线程在EDT上为所有人调用更新方法需要它的客户:

public interface AnimatedComponent {
 public int getInterval(); // how many milliseconds between frames
 public long getLastUpdateTime();
 public void updateAnimation(); // invoked within the swing EDT 
}

无论何时添加动画组件,都应该使用中心动画线程注册它,该线程遍历AnimatedComponent(s)列表,并在需要时调用updateAnimation。

public void updateAllAnimations() {
 long nowTime = System.currentTimeMillis();
 for (AnimatedComponent c : someList) {
  if (c.getLastUpdateTime() - nowTime >= c.getInterval()) {
   c.updateAnimation();
   c.repaint();
  }
 }
}

您应该定期从定时器线程在摇摆EDT上安排此操作(每秒2-3次,具体取决于您的动画预计更新的速度)。