两个线程交替访问相同的char矩阵

时间:2017-03-22 10:07:19

标签: java multithreading

我试图制作一个" 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坐标后它停止。

1 个答案:

答案 0 :(得分:0)

问题出在这里,在第一个'x,y'后,两个线程都在等待'ins'信号量,没有人关心'出局'。

您可以通过删除'outs'来修复它,并仅使用'ins'。在这里你应该仔细检查一下如何实现获取。它是否允许队列或者线程很少获得它两次?