2017-01-06 2 views
-1

Ich habe eine Aufgabe für die Universität, wo ich ein Hangman-Spiel mit Threads in Java implementieren muss. Mein Problem ist, dass ich nicht verstehe, wie man mit den Threads umgehen soll. In meinem Code gibt es einen GameLeader, der den GuessingPlayer dazu auffordert, einen Char einzugeben, den er im startWord rät. Nachdem er das getan hat (run() - Methode) nimmt er die Nachricht weiter. Die Verbindung zwischen den zwei Spielern sollte mit 'Nachrichten' (eigene implementierte Klasse) arrangiert werden. Es funktioniert, wenn ich run() anstelle von wait() verwende. Kannst du mir helfen zu verstehen, warum die While-Schleife nach der ersten eingegebenen Nachricht nicht funktioniert?Java-Threads verstehen

Danke!

Klasse 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); 
       } 
      } 
    } 
} 

Klasse 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

_ "... hilf mir zu verstehen, warum die while-Schleife nicht funktioniert ..." _ Wir können dir nicht helfen, wenn du uns nicht sagst, was du erwartest und warum die aktuelle Ausgabe ** falsch ist ** für dich. – progyammer

+0

https://www.tutorialspoint.com/java/java_multithreading.htm Dies war sehr hilfreich, um mich zu verstehen, wie Threads in Java arbeiten, und enthält ein sehr einfaches Arbeitsbeispiel. – mstorkson

+1

Zunächst einmal empfehle ich ein grundlegendes Tutorial zu Threads, z. [Parallelität] (http://docs.oracle.com/javase/tutorial/essential/concurrency/). Zweitens glaube ich nicht, dass dies ein Problem ist, das Threads benötigt, sie werden die Dinge nur noch komplizierter machen. Schließlich demonstrieren Sie einige schlechte Praktiken, zum Beispiel [Synchronisieren statt auf einem separaten Sperrobjekt] (http: // stackoverflow.com/q/442564/5517612) und [extending 'Thread' anstelle der Implementierung von' Runnable'] (http://stackoverflow.com/a/541506/5517612). –

Antwort

0

Ich glaube, Sie würden auch das Kursmaterial auf Threads überprüfen serviert werden, und/oder zu Ihrem Lehrer sprechen. Aber ein paar Kommentare und Vorschläge:

  1. stelle ich mir die Spielleiter soll ein Thread sein, und der Spieler (n) sollen auch Themen sein (wie der aktuelle GuessingPlayer Klasse ist). Diese werden alle instanziiert und gestartet, wenn Ihr Programm startet, indem Sie die start() -Methode für den Thread aufrufen.

  2. Sie müssen nicht run aufrufen, das intern vom Thread aufgerufen wird, sobald es gestartet wird. Wahrscheinlich möchten Sie jedoch eine Schleife in der run-Methode, die darauf wartet, dass der Thread benachrichtigt wird, und dann wiederholt.

  3. Mit "Nachrichtenübergabe" meinen sie etwas Allgemeines wie ein gemeinsames Objekt oder eine Warteschlange, die alle Threads lesen/schreiben können und auf die sie verweisen können. Ein Thread schreibt etwas in dieses Objekt und ruft Thread.notify() auf, um die anderen Threads zu benachrichtigen, dass in diesem Objekt etwas Interessantes passiert ist. Wenn das passiert, wird der andere Thread genau dort auftauchen, wo er die Thread.wait() -Methode aufgerufen hat. Dann kann es das gemeinsame Objekt prüfen, um zu sehen, was los ist.

http://web.mit.edu/6.005/www/fa14/classes/20-queues-locks/message-passing/

http://www.programcreek.com/2009/02/notify-and-wait-example/

Hoffnung, das hilft.

-1

Sie verwenden die wait() - Methode falsch. Sie benötigen keinen Objektverweis, um die Methode wait() aufzurufen. Es ist eine Methode, die in der Object-Klasse von Java definiert ist. Schreiben Sie deshalb wait(), anstatt den ratePlayer-Objektverweis zu verwenden. Hoffe, das hilft. :)