wątki wait() i notify()

0

Witam, dopiero zaczynam swoją przygodę z javą i współbieżnością i mam taki problem :
Zrobiłem gierkę w której jest 2 graczy ( dla graczy nie tworzyłem osobnej klasy) coś na zasadzie warcaby - że jedna osoba w danym czasie wykonuje ruch. I mam zrobić klasę która odlicza czas gry każdego gracza , w osobnych wątkach w sensie osobno czas leci dla jednego gracza w jednym wątku , osobno dla drugiego w drugim wątku. Wiec stworzyłem klasę stoper rozszerzającą klasę threat z licznikiem i funkcją sleep(1000) żeby co sekundę zwiększała licznik.
I w klasie głównej programu na początku tworzę 2 obiekty klasy stoper , i je uruchamiam poprzez start()

  stoper  g1=new stoper();
  stoper  g2=new stoper();
  g1.start();
  g2.start();

I jeśli klikam przycisk zatwierdź ruch to wywołuję funkcję która sprawdza czy nie wygrał czasem ktoś itp. oraz

 if(jLabel2.getText()=="1"){
            jLabel2.setText("2");
           czekaj(g1);
           wznow(g2);
        }
        else{
            jLabel2.setText("1");
           czekaj(g2);
           wznow(g1);
        }

wywołuję dla odpowiednich graczy funkcję stop i wznow by mierzyły czas dla odpowiedniego gracza.

public class stoper extends Thread {

    public int licznik;
    static int czas_calkowity;

    public stoper() {
        this.licznik=0;
                 }

  public  void run(){

      while(true){
        try{
            Thread.sleep(1000); }
        catch(InterruptedException e){}

            licznik++;
            czas_calkowity++;
          }

  }
  synchronized void czekaj() {
    try {
      this.wait();
  } catch (InterruptedException ie) {
  }
  }

  synchronized void wznow()
  {
     this.notify();
  }

}

Problem polega na tym że gdy kliknę zatwierdź ruch to przycisk pozostaje cały czas wciśnięty i nic się nie dzieje , pewnie dlatego że coś jest nie tak z metodą wait() , i pytanie dlaczego tak się dzieje skoro funkcję wait() wywołuję dla osobnej obiektu który odpowiada za czas a nie za samą grę.

0

PS takiego mam ifa a nie tego co wyżej

if(jLabel2.getText()=="1"){
jLabel2.setText("2");
g1.czekaj();
g2.wznow();
}
else{
jLabel2.setText("1");
g2.czekaj();
g1.wznow();
}

0

Spróbuj wykonywać czynności wykorzystując klasę SwingWorker. Pewnie podpiąłeś wykonywanie sporych operacji bezpośrednio pod listener - klasyczny błąd, też nie kumałem kiedyś o co biega z zamrożeniem mimo osobnych wątków:) Poniżej najprostszy przykład.

    private void fun() {        
        SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
            protected Void doInBackground() {
                //Jakaś operacja
                return null;
            }
        };
        worker.execute();
    }

Więcej info na stronie http://jadept.wordpress.com/2009/06/05/swingworker-w-akcji/

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0