我正在用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";
}
}
}
如果有人可以帮助我,我会很高兴,这对我来说很困难。
答案 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()
。