我试图制作一个" X和O"使用线程的游戏。我在我的游戏桌上使用了一个char矩阵[3] [3],我希望第一个线程放入" X"然后显示矩阵然后第二个威胁到双关语" O"等等。我怎么能用线程做到这一点?
public class ThreadExample implements Runnable {
private char[][] array;
private Semaphore ins, outs;
private int counter;
ThreadExample(Semaphore ins, Semaphore outs) {
this.ins = ins;
this.outs = outs;
this.counter = 0;
this.array = new char[3][3];
}
@Override
public void run() {
for (int i = 0; i < 9; i++) {
try {
ins.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
} // wait for permission to run
print();
playTurn();
outs.release(); // allow another thread to run
}
}
private void print() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
private synchronized void playTurn() {
Scanner sc = new Scanner(System.in);
int x;
int y;
System.out.println("enter the x coord: ");
x = sc.nextInt();
System.out.println("enter the y coord: ");
y = sc.nextInt();
// sc.close();
if (counter % 2 == 0) {
array[x][y] = 'X';
counter++;
} else {
array[x][y] = 'O';
counter++;
}
}
}
这是我的主要
public class Main {
public static void main(String[] args) {
Semaphore a = new Semaphore(1);
Semaphore b = new Semaphore(0);
ThreadExample th1 = new ThreadExample(a, b);
Thread tr1 = new Thread(th1);
Thread tr2 = new Thread(th1);
tr1.start();
tr2.start();
}
}
这是我的代码到目前为止,但在第一个x和y坐标后它停止。
答案 0 :(得分:0)
问题出在这里,在第一个'x,y'后,两个线程都在等待'ins'信号量,没有人关心'出局'。
您可以通过删除'outs'来修复它,并仅使用'ins'。在这里你应该仔细检查一下如何实现获取。它是否允许队列或者线程很少获得它两次?