2014-10-01 40 views
0

我正在用Java做一個Snake遊戲。我有基本的功能,但是當我點擊一個按鈕時,我想暫停遊戲。但是我遇到的問題是當我點擊這個按鈕時,遊戲暫停,但是當我再次點擊時,遊戲無法識別控件。我有一個叫Init的方法,在這個上我初始化線程「Hilo」。我嘗試做第二個線程,在其中我爲該按鈕設置了一個actionPerformed,但問題仍在繼續,現在我更加困惑。這裏是我的代碼:線程問題,在Java中製作遊戲

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

你不能告訴當前線程處理任何進一步的輸入,如果你已經告訴它等待... – 2014-10-01 00:49:28

+0

哦,你有什麼建議?我很困惑,我已經使用線程但不在遊戲中,我只想暫停遊戲並重新啓動它 – Pepe 2014-10-01 00:54:39

回答

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

這部分實際上暫停線程,直到它告訴開始再次的工作。我想你在這種情況下想要的就像循環中的continue;,儘管這並不是一種非常優雅的方式。更適合的方法是使用notify()

1

要重新激活wait()中的線程,必須在同一個對象上調用notify()(或更好的notifyAll())。

您的代碼看起來像您期望暫停您調用wait()的線程。不是這種情況。 wait()將始終暫停進行調用的線程,而不是作爲目標的對象。對於wait()/notifyAll()信令,您可以使用任何對象,但對於通信雙方來說,它必須是相同的對象。

此頁面有一些很好的解釋:http://javamex.com/tutorials/synchronization_wait_notify.shtml