理解Java线程

时间:2017-01-06 17:32:56

标签: java multithreading synchronized

我得到了大学的任务,我必须用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();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我认为您可以很好地查看有关线程的课程资料,和/或与您的教师交谈。但是,一些意见和建议:

  1. 我认为游戏领导者应该是一个线程,并且玩家也应该是线程(就像你当前的GuessingPlayer类一样)。这些都是实例化的,并在程序启动时通过调用线程上的start()方法启动。

  2. 您不必调用run,它会在线程启动后由内部调用。但是你可能希望在run方法中有一个循环来等待通知线程,然后重复。

  3. 通过&#34;消息传递&#34;它们意味着像拥有共享对象或队列一样的所有线程可以读/写并具有引用的东西。一个线程在该对象中写入一些东西,并调用Thread.notify()来通知其他线程该对象中发生了一些有趣的事情。当发生这种情况时,另一个线程将在它调用Thread.wait()方法的地方唤醒。然后它可以检查该共享对象以查看其中的内容。

  4. 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对象引用。 希望这可以帮助。 :)