Как реализовать поток Java с использованием мониторов? - PullRequest
0 голосов
/ 09 сентября 2018

Рассмотрим следующий класс контроллеров в пошаговой многопользовательской игре. Пользователь интерфейс, который работает в отдельном потоке, будет передавать объекты Player и GameMove Тема GameEngine каждый раз, когда один из игроков делает ход.

1 public class GameEngine
2 {
3    private GameWorld world;
4
5    public GameEngine(GameWorld world)
6    {
7     this.world = world;
8    }
9
10    public void startGame()
11    {
12       Runnable task = new Runnable()
13      {
14         @Override
15        public void run()
16       {
17          try
18          {
19            while(true)
20            {
21              Player player = ... // Get current player
22              GameMove move = ... // Get move made by player
23              world.update(player, move);
24            }
25           }
26          catch(InterruptedException ex)
27       {

28       }
29    }
30   });
31   new Thread(task).start();
32  }
33 }

Используя монитор, реализуйте механизм связи внутри GameEngine, это позволяет пользовательскому интерфейсу передавать необходимую информацию в GameEngine, как указано в комментариях. Возможно, вам потребуется добавить дополнительные поля и / или методы

Для вышеприведенного вопроса я написал следующий фрагмент кода.

public class GameEngine
{
    private Object monitor = new Object();
    private GameWorld world;
    private boolean flag = false;

    public GameEngine(GameWorld world)
    {
        synchronized(monitor)
        {
            if(flag)
            {
                monitor.wait();
            }

            this.world = world;
            flag = true;
            monitor.notify();
        }
    }

    public void startGame()
    {
        Runnable task = new Runnable()
        {
         public void run()
         {
            try
            {
                while(true)
                {
                    synchronized(monitor)
                    {
                        if(!flag)
                        {
                            monitor.wait();
                        }
                    }
                    Player player = ...
                    GameMove move = ...
                    World.update(player,move);
                    flag = false;
                    monitor.notify();
                }
            }
            catch (InterruptedException ex)
            {

            }
         }
        };
        new Thread(task).start();
    }
}

Может кто-нибудь проверить, правильный ли мой ответ или нет?

...