Witam!
Tworze gre w j2me w ktorej komputer rzuca 3 razy koscmi, po pierwszym i drugim rzucie wybiera odpowiednie do wymiany, a na koncu wybiera wynik, ktory jest najlepszy. Problemem jest wyswietlenie w/w czynnosci na ekranie, tak aby gracz mogl widziec rozgrywke CPU. Zastosowalem powyzszy sposob, faktycznie watki wykonuje pokolei (o czym swiadcza wypisywane w kolejnosci wejscia i wyjscia - System.out.println), lecz program zwraca tylko wynik, zawieszajac sie(wypisywanie w konsoli dziala, lecz nie dziala odswiezanie ekranu i blokuja sie klawisze) podczas wymiany i rzutow kosci. Czy ma ktos pomysl co jest nie tak ? Teoretycznie watki nie powinny zawieszac dzialania programu, a juz chyba z 5 sposobow rozwiazania tego problemu probowalem :/
Sama obsluga watkow wyglada nastepujaco:
public class kontrolerWatkow{
public int kontrola_watku=1;
}
public class graCpu1 extends Thread{
private kontrolerWatkow kontroler;
public graCpu1(kontrolerWatkow kw){
kontroler=kw;
}
public void run(){
synchronized(kontroler){
System.out.println("Wejscie watek1");
while(kontroler.kontrola_watku!=1){
try{
kontroler.wait();
}
catch (Exception e) {}
}
losowanie(ileKosciWymieniane());
pokazTabeleWynikow();
dokonajWyboru();
try{
this.sleep(2000);
}
catch (Exception e) {}
System.out.println("Wykonano watek1");
kontroler.kontrola_watku=2;
kontroler.notifyAll();
}
}
}
public class graCpu2 extends Thread{
private kontrolerWatkow kontroler;
public graCpu2(kontrolerWatkow kw){
kontroler=kw;
}
public void run(){
synchronized(kontroler){
System.out.println("Wejscie watek2");
while(kontroler.kontrola_watku!=2){
try{
kontroler.wait();
}
catch (Exception e) {}
}
losowanie(ileKosciWymieniane());
pokazTabeleWynikow();
dokonajWyboru();
try{
this.sleep(2000);
}
catch (Exception e) {}
System.out.println("Wykonano watek2");
kontroler.kontrola_watku=3;
kontroler.notifyAll();
}
}
}
public class graCpu3 extends Thread{
private kontrolerWatkow kontroler;
public graCpu3(kontrolerWatkow kw){
kontroler=kw;
}
public void run(){
synchronized(kontroler){
System.out.println("Wejscie watek3");
while(kontroler.kontrola_watku!=3){
try{
kontroler.wait();
}
catch (Exception e) {}
}
losowanie(ileKosciWymieniane());
pokazTabeleWynikow();
try{
this.sleep(2000);
}
catch (Exception e) {}
wyborWyniku();
System.out.println("Wykonano watek3");
kontroler.kontrola_watku=1;
kontroler.notifyAll();
}
}
}
A uruchamiane jest to w ten sposob:
public class Rozgrywka{
public kontrolerWatkow KontrolerWatkow=new kontrolerWatkow();
public graCpu1 gra1=new graCpu(KontrolerWatkow);
public graCpu2 gra2=new graCpu(KontrolerWatkow);
public graCpu3 gra3=new graCpu(KontrolerWatkow);
public void graj(){
gra1.run();
gra1.run();
gra1.run();
}
}