如何使用监视器实现java线程?
在基于回合的多人游戏中,考虑以下控制器类。用户 接口在单独的线程中运行,将玩家和GameMove对象传递给 每次一个玩家移动时游戏引擎的线程如何使用监视器实现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
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()
上的另一个线程就会醒来并对变化做出反应。