Многопоточность - Не будить другие темы в пошаговой игре. Джава - PullRequest
0 голосов
/ 04 ноября 2018

Я новичок в многопоточности, но меня попросили создать игру. Я хочу, чтобы каждый игрок выполнял свой ход одновременно, но не позволял игроку делать 4 хода, тогда как другому игроку - 1 ход.

Мой метод run () в настоящее время выглядит следующим образом:

public synchronized void run(){  
        while (!gameWon) {
            takeTurn();
            hasPlayerWon();
            playersTurnTaken += 1;
            System.out.println(Thread.currentThread().getName() + " has taken their turn");
            if (playersTurnTaken != n) {
                try {
                    wait();
                } catch (InterruptedException e) {}
            } else {
                playersTurnTaken = 0;
                notifyAll();
            }
        }
    }

Это внутри вложенного класса, называемого игроком, где родительским классом является CradGame, а CardGame содержит атрибут PlayersTurnTaken. Я использую эту переменную, чтобы выяснить, когда каждый игрок сделал свой ход, и он объявлен как переменная переменная (я думаю, именно так вы и должны ее определить).

Вывод программы такой:

Thread-3 has taken their turn
Thread-1 has taken their turn
Thread-2 has taken their turn
Thread-0 has taken their turn
Thread-0 has taken their turn

и тогда я предполагаю, что все потоки ожидают, так как программа не заканчивается.

Почему они не просыпаются после того, как Нить-0 заканчивает свой первый ход? Любая помощь приветствуется.

1 Ответ

0 голосов
/ 04 ноября 2018

Это просто. Проблема в том, что потоки должны выполняться последовательно, один за другим.

Я предполагаю, что у вас есть все экземпляры игроков, созданные из одного класса, и все они читают общую переменную (volatile).

Точки нужно позаботиться, чтобы это работало. - Пожалуйста, используйте переменную Atomic вместо volatile. Летучие, как правило, хорошо, когда это логическая переменная.

  • Передайте эту переменную в каждом экземпляре объекта player вместе с переменной int.

    AtmomicInteger sharedVariable = new AtomicInteger(1);
    Player player1 = new Player(sharedResource, countToCheck);
    
  • Теперь предположим, что для инициации игрока 1 и 2 вы должны сделать это ниже.

    Player player1 = new Player(sharedResource, 1);
    Player player2 = new Player(sharedResource, 2);
    
  • Каждый метод запуска игрока проверяет счетчик sharedVariable с помощью countToCheck. однажды они равны, метод run завершает выполнение и обновляет sharedVariable считать до + 1.

  • Player1 получает чеки, если значение sharedResource равно 1 или нет. Если да, то это выполняется, а затем обновляет значение sharedResource до 2. Оттуда player2 будет выполнить метод run, так как он ожидал, что значение sahredResource будет 2. ... и так на всех потоках игрока, которые вы создаете, продолжит выполняться ..

...