gpt4 book ai didi

java - 虽然条件为假,但循环仍继续运行

转载 作者:行者123 更新时间:2023-12-01 07:03:49 25 4
gpt4 key购买 nike

好吧,我在这里修复这个错误有点困难,所以在我花另一天搜索之前,我会问你们。

//Core Class
static String serverAnswer = "";

public static void sendMessage(String msg){
serverAnswer = "";
Connection.send(msg);
while(serverAnswer.equals("")); <infinity loop
}

//Connection Thread
public void run() {
while(running){
try {
msg = (String)in.readObject();
Core.serverAnswer = msg;
} catch (StreamCorruptedException e){
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

实际上线程应该等待服务器响应然后设置答案

所以循环应该停止,但我不会停止......

我已经检查了以下内容:

  • 线程正在运行:是
  • 问题肯定是一个无限的 while 循环
  • Core.serverAnswer 肯定会从服务器获取一个字符串。

那么关于 while() 有什么我不知道或不知道问题可能出在哪里吗?

最佳答案

除非您使用 volatile ,否则 JVM 可以自由内联该值。特别是它可以免费完全优化读取并且不再检查它。

您需要使您的字段 volatile

破坏此优化以实现线程安全操作的一种方法。

while(serverAnswer.equals(""))
Thread.yield();

但是更好的解决方案是将对象读入 BlockingQueue

public class TextSocket implements Closeable {
final Socket socket;
private final BufferedReader reader;
private final PrintWriter writer;

public TextSocket(String hostname, int port) throws IOException {
this(new Socket(hostname, port));
}

public TextSocket(Socket socket) throws IOException {
this.socket = socket;
reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8));
}

public String sendAndRead(String msg) throws IOException {
writer.println(msg);
if (writer.checkError())
throw new IOException("Unable to write");
writer.flush();
return reader.readLine();
}

@Override
public void close() throws IOException {
socket.close();
}
}

我还建议您避免使用这样的静态字段。您可以使用实例字段来实现您的连接,如果您愿意,您可以拥有多个连接。

关于java - 虽然条件为假,但循环仍继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32330571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com