2017-05-07 32 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()); 

您必须将结果存储在一个变量中,然后才能使用此变量进行打印或执行任何操作。