【问题标题】:Understand Java Threads了解 Java 线程
【发布时间】:2017-01-06 17:32:56
【问题描述】:

我得到了一个大学作业,我必须用 Java 中的 Threads 实现一个刽子手游戏。 我的问题是我无法理解如何处理线程。 在我的代码中有一个 GameLeader 提示 GuessingPlayer 输入他在 startWord 中猜测的字符。在他这样做之后(run()-method),他将消息传递得更远。 两个玩家之间的连接应该用'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);
                }
            }
    }
}

类 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();
        }
    }
}

【问题讨论】:

  • "...帮助我了解为什么 while 循环不起作用..." 除非您告诉我们您的期望和原因,否则我们无法帮助您当前输出对您来说错误
  • tutorialspoint.com/java/java_multithreading.htm 这对于让我了解线程在 java 中的工作方式非常有帮助,并且包含一个非常简单的工作示例。
  • 首先,我建议您查看有关线程的基本教程,例如。 Concurrency。其次,我认为这不是需要线程的问题,它们只会使事情进一步复杂化。最后,您展示了一些不好的做法,例如synchronizing on this instead of on a separate lock objectextending Thread instead of implementing Runnable
  • 感谢您的回答。我现在明白了,wait() 类似于 sleep()。我知道没有线程会容易得多,也许这就是我如此困惑的原因。但是我忘了说guessingPlayer只有30秒来写一个字符/单词,我认为为此我需要同步?

标签: java multithreading synchronized


【解决方案1】:

我认为您会很好地查看线程上的课程材料,和/或与您的讲师交谈。但是,一些cmets和建议:

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

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

  3. “消息传递”是指一般的东西,比如拥有一个所有线程都可以读/写和引用的共享对象或队列。一个线程在该对象中写入一些内容,并调用 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/

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您以错误的方式使用 wait() 方法。调用 wait() 方法不需要对象引用。它是在 Java 的 Object 类中定义的方法。 因此,只需编写 wait() 而不是使用 guessingPlayer 对象引用。 希望这可以帮助。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多