java - 线程卡在 readUTF() 中

标签 java multithreading sockets datainputstream

我有以下类(class):

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

最佳答案

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

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

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

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

关于java - 线程卡在 readUTF() 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43837589/

相关文章:

java - 在 Android 中保存之前保留数据

java - java中让线程有返回值

c# - 如何知道tcp服务器是否处于监听状态

java - 账户之间的多线程银行转账

c++ - 在网络中通过 Socket 进行文件传输时,此程序中的文件传输错误是什么?

c++ - Linux套接字文件描述符通常适合散列吗

java - 使位图大小和位置在每个设备上都相同

java - 如何在 Java map 中使用集合作为键

java - 从日期选择器中获取值

VB.NET 尝试将泛型 Invoke 方法修改为泛型 BeginInvoke 方法,出现意外问题