2017-05-07 5 views
0

J'ai la classe suivante:fil coincé dans readUTF()

public class Prices { 

    String priceValues; 

    public String getPriceValues() { 
     return priceValues; 
    } 

    public void setPriceValues(String priceValues) { 
     this.priceValues = priceValues; 
    } 
} 

Ceci est ma méthode run dans la SocketServer classe:

public void run() { 
     while(true) { 
     try { 
      DataInputStream in = new DataInputStream(server.getInputStream()); 

      System.out.println(in.readUTF()); 
      prices.setPriceValues(in.readUTF()); 
      DataOutputStream out = new DataOutputStream(server.getOutputStream()); 
      out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() 
       + "\nGoodbye!"); 
      //server.close(); 

     }catch(SocketTimeoutException s) { 
      System.out.println("Socket timed out!"); 
      break; 
     }catch(IOException e) { 
      e.printStackTrace(); 
      break; 
     } 
     } 
    } 

Tout fonctionne bien, mais je veux conserver ce que je suis recevoir du client de telle sorte qu'il puisse être consulté par n'importe quelle classe. J'ai donc créé une classe appelée Prices.

Cependant, le fil est bloqué sur la ligne suivante:

prices.setPriceValues(in.readUTF()); 

La variable prices est non nul, et tout fonctionne bien quand je prends cette ligne sur.

+1

Vous ne devez pas recréer 'DataInputStream' à chaque fois autour de la boucle. Créez-le avant la boucle. – EJP

Répondre

2
System.out.println(in.readUTF()); 
prices.setPriceValues(in.readUTF()); 

Vous appelez in.readUTF() deux fois. Ce n'est probablement pas ce que vous voulez. Retirez la première ligne, ou stocker le résultat dans une variable:

String s = in.readUTF(); 
System.out.println(s); 
prices.setPriceValues(s); 

Notez que la définition et l'obtention d'un champ à partir de plusieurs threads sans aucune synchronisation n'est pas thread-safe.

0
System.out.println(in.readUTF()); 
prices.setPriceValues(in.readUTF()); 

Vous devez avoir à stocker le résultat dans une variable, vous pouvez imprimer ou quoi que ce soit que vous voulez avec cette variable.