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ę.