在java中使用并发线程

时间:2012-11-18 21:28:08

标签: java multithreading concurrency awt

我有一个程序(一个AWT框架,是的,我知道Swing更好,但我被限制使用它),它有2个移动对象。所以我想我会把每个都放在自己的线程中以允许对象以不同的速度移动等等。

一个线程(gameThread)处理一个弹跳球,另一个线程(cannonThread)处理屏幕上绘制的大炮以及由它发射的射弹。我不确定如何分离球的速度和射弹的速度,这就是为什么我认为2个线程可以工作(使用thread.sleep(speedofobject))。

我不知道如何实现它们,我的随机猜测(显然)不起作用。屏幕上没有显示任何内容,并且编译时没有生成错误。以前,球会出现在屏幕上并按原样移动。

这是我试图做多个线程的片段。如果您需要更多信息,请告诉我,我会发布。

public void start()
{
    if (gameThread == null)
    {
        gameThread = new Thread(this);
        gameThread.start();
    }
    if (cannonThread == null)
    {
        cannonThread = new Thread(this);
        cannonThread.start();
    }       
}

public void run()
    {
        //thread for the ball, collision detection and scorekeeping
        if (Thread.currentThread().equals(gameThread))
        {
            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
            while (!kill)
            {
                if (!paused)
                {
                    target.repaint();
                }
                try
                {
                    Thread.sleep(ballSpeed);
                }
                catch(InterruptedException e){System.err.println("Interrupted.");}
            }
            stop(); 
        }

        //thread for the cannon and projectile
        if (Thread.currentThread().equals(cannonThread))
        {
            Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
            if (!paused)
            {
                if (projectileFiring)
                {
                    cannon.repaint();
                }
                try
                {
                    Thread.sleep(projectileSpeed);
                }
                catch(InterruptedException e){System.err.println("Interrupted.");}
            }
        }   
    }

1 个答案:

答案 0 :(得分:0)

为你的世界中的每个对象设置一个单独的线程是不可取的。解决这个问题的一种方法是让一个单独的线程负责更新“世界模型”(在你的情况下,球和大炮)。这个世界模型线程将运行以下动画循环:

  1. 短暂睡觉
  2. 根据当前时间更新代表球和大炮的数据
  3. 表示需要使用当前模型更新UI
  4. 请注意,使用此方法,您将需要同步对模型数据的访问,因为它将由一个线程中的动画循环更新,并由呈现代码读取以更新UI。您不希望数据在阅读时发生变化。