线程卡在 readUTF() 中
Thread stuck in readUTF()
我有以下 class:
public class Prices {
String priceValues;
public String getPriceValues() {
return priceValues;
}
public void setPriceValues(String priceValues) {
this.priceValues = priceValues;
}
}
这是我在 SocketServer
class:
中的 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;
}
}
}
一切正常,但我想以任何 class 都可以访问的方式存储我从客户端收到的内容。所以我创建了一个名为 Prices
的 class。
但是,线程卡在了以下行:
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);
请注意,在没有任何同步的情况下从多个线程设置和获取字段不是线程安全的。
System.out.println(in.readUTF());
prices.setPriceValues(in.readUTF());
您必须将结果存储在一个变量中,然后您可以打印或使用此变量做任何您想做的事情。
我有以下 class:
public class Prices {
String priceValues;
public String getPriceValues() {
return priceValues;
}
public void setPriceValues(String priceValues) {
this.priceValues = priceValues;
}
}
这是我在 SocketServer
class:
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;
}
}
}
一切正常,但我想以任何 class 都可以访问的方式存储我从客户端收到的内容。所以我创建了一个名为 Prices
的 class。
但是,线程卡在了以下行:
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);
请注意,在没有任何同步的情况下从多个线程设置和获取字段不是线程安全的。
System.out.println(in.readUTF());
prices.setPriceValues(in.readUTF());
您必须将结果存储在一个变量中,然后您可以打印或使用此变量做任何您想做的事情。