랜덤 넘버를 생성하고 getchoice 메소드와 생성 된 숫자를 반환하고 실행을 알리는 getchoice 메소드를 기다리는 run 메소드를 구현하는 Player 클래스 (runnable을 구현하는 클래스)를 만들도록 요청받습니다. 다음에, 각각의 player object를 포함한 2 개의 thread를 포함하는 메소드의 실행을 포함한 RockPaperScissors 클래스 (Runnable를 구현하고있다)는,이 2 개의 thread는 서로 1000 회 재생해야합니다. 그 후, 중단되고 나서, 각 player가 몇 회 표시되는지를 나타냅니다 원 . . 내 문제는, 내 코드가 실행되기 시작하면 처음에는 완벽하지만 무작위 라운드에서는 게임의 목적을 상실한 플레이어 2에게 가기 전에 여러 번 플레이어 1을 재생하기 시작합니다. 코드는 다음과 같습니다.두 스레드를 주기적으로 실행하는 방법은 무엇입니까?
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++ ;
}
이 클래스의 플레이어입니다 :
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;
}
}
}
내 programm에 완벽하게 카운터 디스플레이는 항상 1000 0에서 시작하는 번호가 있어야 실행하는 경우
다른 후 하나를 복제하지만, 여기에 그것처럼 시작하지만 그때 그것은 엉망이된다. 1000에 이르지 못한다. 때로는 700에서 때때로 800으로 멈춘다. 내가 사용하도록 허용 된 것은 notify(), notifyAll(), wait(), start(), interrupt() 및 join()입니다.도움을 주시면 대단히 감사하겠습니다. 감사합니다
Runnable 오브젝트는이 뛴하지 얼마나 많은 시간을 게임을 승리 사용자에 대한 정보가 있어야합니다. – duffymo
RockPaperScissors의 실행 파일을 의미합니까? – Domarius
예. 내가 너라면, 두 선수가 완벽하게 작동하는 게임의 논리가 나올 때까지 스레드에 대해 잊어 버릴 것이다. 일단 그렇게하면 다중 스레드로 만듭니다. – duffymo