2017-05-07 63 views
0

我有以下類:線程停留在的readUTF()

public class Prices { 

    String priceValues; 

    public String getPriceValues() { 
     return priceValues; 
    } 

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

這是我run方法在SocketServer類:

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

一切都正常運行,但我想保存我是什麼從客戶處接收任何類別可以訪問的方式。所以我創建了一個名爲Prices的課程。

但是,線程被卡在下面一行:

prices.setPriceValues(in.readUTF()); 

prices變量不爲空,且一切運行正常,當我走這條線了。

+1

每次在循環中都不應該重新創建'DataInputStream'。在循環之前創建它。 – EJP

回答

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

您打給in.readUTF()兩次。這很可能不是你想要的。在一個變量中除去第一線,或存儲結果:

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

注意設置,並從多個線程得到一個領域沒有任何同步是不是線程安全的。

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

您必須將結果存儲在一個變量中,然後才能使用此變量進行打印或執行任何操作。