我得到了大学的任务,我必须用Java中的Threads实现一个刽子手游戏。 我的问题是我无法理解如何处理线程。 在我的代码中有一个GameLeader,它提示GuessingPlayer输入一个他在startWord中猜到的字符。在他这样做之后(run() - 方法),他进一步接收了这个消息。 两个玩家之间的联系应该用'Messages'(自己实现的类)来安排。如果我使用run()而不是wait(),它会工作。 你可以帮我理解为什么在第一次输入消息后while循环不起作用吗?
谢谢!
类GameLeader:
public class GameLeader {
public static void main(String[] args) throws IOException {
GuessingPlayer guessingPlayer = new GuessingPlayer(userInterface);
String guess;
System.out.println("Please enter a startWord to begin!");
String startWord = userInterface.enterWord();
guessingPlayer.start();
while (attempts < 11) {
synchronized (guessingPlayer) {
System.out.println("It's your turn, Guessing Player!");
guessingPlayer.wait();
guess = guessingPlayer.message.toString();
if (startWord.contains(guess)) {
...
}
} else {
...
}
userInterface.mainMenu(guess);
}
}
}
}
Class GuessingPlayer:
public class GuessingPlayer extends Thread {
Message guessMessage;
private UserInterface userInterface;
GuessingPlayer(UserInterface userInterface) {
this.userInterface = userInterface;
}
@Override
public void run() {
synchronized (this) {
guessMessage = new Message(userInterface.enterWord());
notify();
}
}
}
答案 0 :(得分:0)
我认为您可以很好地查看有关线程的课程资料,和/或与您的教师交谈。但是,一些意见和建议:
我认为游戏领导者应该是一个线程,并且玩家也应该是线程(就像你当前的GuessingPlayer类一样)。这些都是实例化的,并在程序启动时通过调用线程上的start()方法启动。
您不必调用run,它会在线程启动后由内部调用。但是你可能希望在run方法中有一个循环来等待通知线程,然后重复。
通过&#34;消息传递&#34;它们意味着像拥有共享对象或队列一样的所有线程可以读/写并具有引用的东西。一个线程在该对象中写入一些东西,并调用Thread.notify()来通知其他线程该对象中发生了一些有趣的事情。当发生这种情况时,另一个线程将在它调用Thread.wait()方法的地方唤醒。然后它可以检查该共享对象以查看其中的内容。
http://web.mit.edu/6.005/www/fa14/classes/20-queues-locks/message-passing/
http://www.programcreek.com/2009/02/notify-and-wait-example/
希望这有帮助。
答案 1 :(得分:-1)
您正在以错误的方式使用wait()方法。您不需要对象引用来调用wait()方法。它是Java的Object类中定义的方法。 因此,只需编写wait()而不是使用guessingPlayer对象引用。 希望这可以帮助。 :)