Ich werde gebeten, eine Player-Klasse zu erstellen (die Runnable implementiert), in der ich eine Run-Methode implementiere, die eine Zufallszahl generiert und auf die Methode getchoice und eine getchoice-Methode wartet, die die generierte Zahl zurückgibt und die Ausführung meldet. dann eine RockPaperScissors-Klasse (die Runnable implementiert), die Methoden enthält, die zwei Threads enthalten, die jeweils ein Spielerobjekt enthalten, diese zwei Threads sollten 1000 Mal gegeneinander spielen, dann sollten sie unterbrochen werden und dann wird angezeigt, wie oft jeder Spieler gewonnen . . Mein Problem ist, wenn mein Code anfängt zu laufen, ist es am Anfang perfekt, aber bei einer zufälligen Runde fängt es an, einfach mehrmals Spieler 1 zu spielen, bevor er zu Spieler 2 geht, was den Zweck des Spiels zunichte macht: hier ist der Code:Wie zwei Threads regelmäßig ausgeführt werden?
public class RockPaperScissors implements Runnable {
int result1 ;
int result2 ;
int result3 ;
private final Object lock = new Object();
public void run(){
synchronized(lock){
Player a = new Player() ;
Player b = new Player() ;
Thread a1 = new Thread(a) ;
Thread b1= new Thread (b) ;
a1.start();
b1.start();
int choice1 = -100 ;
int choice2 = -1066 ;
for (int i = 0 ; i < 1000 ; i++){
try {
choice1 = a.getChoice();
} catch (InterruptedException e1) {
}
try {
choice2 = b.getChoice();
} catch (InterruptedException e) {
}
if (choice1 == 1 && choice2==0)
result2++;
else if (choice2 == 1 && choice1==0)
result1++;
else if (choice1 == 1 && choice2==1)
result3++ ;
else if (choice1 == 1 && choice2==2)
result1++ ;
else if (choice1 == 2 && choice2==1)
result2++ ;
else if (choice1 == 0 && choice2==2)
result1++ ;
else if (choice1 == 2 && choice2==0)
result2++ ;
else if (choice1 == 2 && choice2==2)
result3++ ;
else if (choice1 == 0 && choice2==0)
result3++ ;
}
und das ist Klasse-Spieler:
public class Player implements Runnable {
private final Object lockvalue = new Object();
private int a;
public void run() {
synchronized (lockvalue) {
for (int counter = 0; counter < 1000; counter++) {
java.util.Random b = new java.util.Random();
a = b.nextInt(3);
System.out.println(counter);
try {
lockvalue.wait();
} catch (InterruptedException e) {
System.out.println("Thread player was interrupted");
}
}
}
}
public int getChoice() throws InterruptedException {
synchronized (lockvalue) {
lockvalue.notify();
return a;
}
}
}
, wenn mein Programm läuft perfekt die Zähleranzeige immer die Nummer sollte von 0 bis 1000 beginnend dupliziert nacheinander, aber Hier fängt es an, aber dann wird es durcheinander gebracht nd es erreicht nie 1000, es stoppt manchmal bei 700 manchmal bei 800. alles, was ich verwenden darf, ist notify(), notifyAll(), wait(), start(), interrupt() und join().
Ihre Hilfe würde sehr geschätzt werden.
Dank
Die Runnable sollte nur Informationen darüber, wer das Spiel gewinnt, nicht, wie oft es gespielt wird. – duffymo
meinst du das lauffähige von RockPaperScissors? – Domarius
Ja. Wenn ich du wäre, würde ich Threads vergessen, bis ich die Logik des Spiels mit zwei Spielern perfekt funktioniert hatte. Sobald Sie das haben, machen Sie es Multithread. – duffymo