【问题标题】:Thread stuck in readUTF()线程卡在 readUTF()
【发布时间】:2017-05-07 22:59:53
【问题描述】:

我有以下课程:

public class Prices {

    String priceValues;

    public String getPriceValues() {
        return priceValues;
    }

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

这是我在SocketServer 类中的run 方法:

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 变量不为空,当我取出这条线时,一切运行良好。

【问题讨论】:

  • 您不应该在每次循环时都重新创建DataInputStream。在循环之前创建它。

标签: java multithreading sockets datainputstream


【解决方案1】:
System.out.println(in.readUTF());
prices.setPriceValues(in.readUTF());

您呼叫in.readUTF() 两次。这很可能不是你想要的。删除第一行,或将结果存储在变量中:

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

请注意,在没有任何同步的情况下从多个线程设置和获取字段不是线程安全的。

【讨论】:

    【解决方案2】:
    System.out.println(in.readUTF()); 
    prices.setPriceValues(in.readUTF());
    

    您必须将结果存储在一个变量中,然后您可以使用该变量打印或做任何您想做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多