线程问题,用Java制作游戏

时间:2014-10-01 00:46:01

标签: java

我正在用Java做一个Snake游戏。我有基本的功能,但我想在点击按钮时暂停游戏。但我遇到的问题是,当我点击此按钮时,游戏暂停,但当我再次点击时,游戏无法识别控件。我有一个名为Init的方法,在此我初始化线程" Hilo"。我尝试制作第二个线程,其中我为按钮设置了actionPerformed,但问题仍在继续,现在我更加困惑。这是我的代码:

Thread hilo; //I declared the thread
String state=""; //It is for control de state (paused or no)

Runnable hiloFor = new Runnable() 
{
    public void run() 
    {
        Thread actual = Thread.currentThread();
        synchronized(actual) 
        {
            do
            {
                //Game instructions (there are a lot of them)
                if(state.equals("paused")) 
                {
                    actual.wait();
                }

            }while(!option.equals("Exit"));
        }
    }
};


//This is my action performed where I control if it is paused
public void actionPerformed(ActionEvent e)
{
    if ( e.getSource() == btnPause )
    { 

        if(state.equals("paused")) 
        {
            cont(); //method for reactive the thread
            state="";
        }else if(state.equals(""))
        {
            state="paused";
        }
    }

}

如果有人可以帮助我,我会很高兴,这对我来说很困难。

2 个答案:

答案 0 :(得分:1)

要重新激活wait()中的主题,您必须在同一个对象上调用notify()(或更好notifyAll())。

您的代码看起来好像会暂停您调用wait()的主题。不是这种情况。 wait()将始终暂停进行调用的线程,而不是作为目标的对象。您可以将任何对象用于wait() / notifyAll()信令,它只需要是通信双方的相同对象。

本页面有一些很好的解释:http://javamex.com/tutorials/synchronization_wait_notify.shtml

答案 1 :(得分:0)

if(state.equals("paused")) 
{
    actual.wait();
}

这部分实际上暂停了线程,直到它被告知再次启动它的工作。我想在这种情况下你想要的东西就像循环中的continue;,虽然这不是一种非常优雅的方法。更合适的方法是使用notify()