java - 多线程多球游戏

标签 java multithreading swing

我正在做一个关于多个球弹跳的学校项目。到目前为止,我设法创建了应用程序并且一切正常。但是,我还需要在应用程序中实现多线程,这就是我被困的地方。我在想一个球一个线程,但我不确定如何实现它。到目前为止,这是我的代码(部分):

public void paintComponent(Graphics g)
        {
            super.paintComponent(g);

            //The balls are painted only after the timer is started
            if(bTimer)
            {
                for(Ball ball:ballList.ballsArrayList) 
                {
                    Thread ballThread = new Thread(ball);
                    ballThread.start();
                    ball.draw(g);

                    /*other code for moving the ball*/
                }
            }
        }

在 Ball 类中:

     public void draw(Graphics g) {
          Color color = new Color(this.getColorR(),this.getColorG(),this.getColorB());
          g.setColor(color);
          int radius = this.getsize();
          g.fillOval((int)(this.getX() - radius), (int)(this.getY() - radius), (int)(2 *     
          radius), (int)(2 * radius));

       }

     public void run() {  

            String name = Thread.currentThread().getName();  

            for (int i = 0; i < 200; i++) {  

                //ball.draw(g); ??

                try {  
                    Thread.sleep(50); 
                    System.out.println("Sleeping");
                } catch (Exception ex) {}  
            }  
        }  

我在想我可以将 ball.draw() 函数放在线程的 run() 函数中。但我不知道我该怎么做,或者这是否是个好主意。多线程对我来说还是很难理解和实现 =((

最佳答案

不是真正的答案,但太长了无法发表评论。

您应该注意到 Swing 不是线程安全的。所有 Swing 组件都应该在事件调度线程上访问,并且只能在该线程上访问。查看Concurrency in Swing指南了解更多信息。

这意味着每个球可以有一个线程来更新球的位置。但是,如果您在绘画期间访问球的位置,则此访问发生在 EDT 上。这意味着您无法随时更新后台线程中球的位置。您将不得不实现一些锁定或简单地更新 EDT 上的位置。

我不确定您要达到什么目的,但如果您只是想在特定时间间隔更新球的位置,我会选择 javax.swing.Timer。该计时器在 EDT 上触发,允许您以线程安全的方式更新位置。 Swing wiki 标签包含更多用于在 Swing 中实现动画的链接。

关于java - 多线程多球游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13193487/

相关文章:

c# - Log4net : Rolling File Operation : Failing with Source does not exist

java - Java 框架中 JPanel 表单之间的切换

java - BufferedReader/BufferedWriter 逐行输出

Java - 使用文件名数组对每个文件运行方法

java - hibernate 和Java

java - 使用 "notify()"& "wait()"而不是 "suspend()"和 "resume()"来控制线程

c++ - 我怎样才能为每个实例拥有非静态线程局部变量

Java SocketChannel 吃掉我的字节

java - 来自不同类的 JButton

java - 在 JPanel 中居中对齐 JLabel 中的文本时出现问题