2016-06-18 16 views
-1

Ich programmiere einen Server mit Java mit mehreren Threads, kaufe sehr früh einen sehr seltsamen Fehler.Println und Threads in Java

Hier ist mein Code:

package net.twh; 

import java.net.DatagramSocket; 
import java.util.Scanner; 

public class Server { 

    public static EntryThread entry; 
    public static ServerPhases phase; 
    public static DatagramSocket serverSocket; 

    public static boolean stopProgram; 

    public static Scanner keyboard; 

    public static void main(String[] args) { 
     Configuration.port = 17550; 

     keyboard = new Scanner(System.in); 

     entry = new EntryThread(); 

     entry.run(); 

     while (!stopProgram) 
     { 
      String line = ""; 
      System.out.printf("> "); 
      line = keyboard.next(); 

      System.out.printf(line); 

      if (line == "close") 
      { 
       entry.stop = true; 
       stopProgram = true; 
      } 
     } 
    } 

} 

Und hier ist mein Thread:

package net.twh; 

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.SocketException; 

public class EntryThread extends Thread { 

    public boolean stop; 

    public EntryThread() { 
     stop = false; 
    } 

    public void run() { 
     Runtime.getRuntime().addShutdownHook(new Thread(){public void run(){ // AUTOCLOSE NE PAS SUPPRIMER !!!!! 
      try { 
       Server.serverSocket.close(); 
       System.out.println("The server is shut down!"); 
      } catch (Exception e) { /* failed */ } 
     }}); 

     try { 
      Server.serverSocket = new DatagramSocket(Configuration.port); 
      byte[] receiveData = new byte[8]; 

      System.out.printf("Listening on udp:%s:%d%n", 
      InetAddress.getLocalHost().getHostAddress(), Configuration.port);  
      DatagramPacket receivePacket = new DatagramPacket(receiveData, 
           receiveData.length); 
      while(!stop) { 
       Server.serverSocket.receive(receivePacket); 
       byte[] data = receivePacket.getData(); 
       System.out.println("RECEIVED: " + new String(data)); 
       InetAddress IPAddress = receivePacket.getAddress(); 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

Die Nachricht, wenn ein Paket funktioniert und die Scanner funktioniert recieving, aber die ">" und Zeichenfolge eingegeben i ‚Doesn t auftauchen.

+0

Ich glaube, das die Nutzung von System.out.printf sein könnte, anstatt println –

+2

Du den Thread nicht starten, werden Sie nur die Ausführung der 'run()' Methode der Thread nacheinander. Der richtige Weg, um einen Thread zu starten, lautet 'entry.start()' anstelle von 'entry.run()'. – JMSilla

+0

@JMSilla Wenn du das als Antwort postest, werde ich es aufwerten. –

Antwort

0

Der Strom von System.out ein PrintStream ist, der nur seinen Ausgang spült auf neue Zeilen (siehe this answer). Aber man kann expliziten Aufruf flush() oder Druck ein Newline (die noch besser in Ihrem Beispiel aussehen würde):

while (!stopProgram) 
    { 
     String line = ""; 
     System.out.print("> "); 
     System.out.flush(); 
     line = keyboard.next(); 

     System.out.println(line); 

     if ("close".equals(line)) 
     { 
      entry.stop = true; 
      stopProgram = true; 
     } 
    } 

Wie ich verstehe nicht, warum verwendet man printf() ohne Formatierung ich es durch die entsprechenden Methoden ersetzt.

BTW: JMSilla ist richtig, Ihr Code tut nichts gleichzeitig, aber das ist nicht die Frage hier.

0

Jetzt haben Sie run Methode anstelle von start() aufgerufen, run() Methode in Thread ist, dass Start neuen Thread erstellt, während run keinen Thread erstellen und einfach im aktuellen Thread wie ein normaler Methodenaufruf ausführen.

entry = new EntryThread(); 
entry.run(); 

Verwenden

entry.start()