Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用监视器实现java线程?_Java_Monitor_Java Threads - Fatal编程技术网

如何使用监视器实现java线程?

如何使用监视器实现java线程?,java,monitor,java-threads,Java,Monitor,Java Threads,在基于回合的多人游戏中,考虑以下控制器类。用户 接口在单独的线程中运行,将玩家和GameMove对象传递给 每次一个玩家移动时游戏引擎的线程 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

在基于回合的多人游戏中,考虑以下控制器类。用户 接口在单独的线程中运行,将玩家和GameMove对象传递给 每次一个玩家移动时游戏引擎的线程

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内部实现通信机制, 这允许UI将所需信息传递给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();
    }
}

有人能检查一下我的答案是否正确吗?

(1)为什么
游戏世界
构造函数使用
同步
?(2) 为什么您的
Runnable
缺少
run()
方法?(3)
标志的作用是什么?@9000抱歉,我错过了run()方法。更正了。该标志用于检查是否修改了世界对象。游戏世界构造函数位于另一个线程中,因此我希望它锁定世界对象。这就是我同步它的原因。什么是
同步的
/
私有的
/
中断执行
?@andreTobilkocorrected@Pegasus008:如果世界对象没有更改,那么调用处理程序有什么意义?我希望在世界发生变化时使用
.notify()
,这样睡在
.wait()
上的另一个线程就会醒来并对变化做出反应。