首页 > 解决方案 > Client-Thread 神秘地遗漏了 Java 代码,因此没有回答

问题描述

执行每一行代码 -> 事件 -> 跳过重要的 Java 代码行

# 客户端-服务器 # AssumeNoCodeOptimization # IDE:Processing 麻省理工学院的 Processing.org)

有一个线程“ConnectionHandler”停留在一个循环中,它可以发送或接收数据。在它接收到第一个数据之前,每行代码都会被执行。之后,程序似乎在 System.out.println() 处暂停!?然后,当更多数据到达时,Java 代码的某些行会再次执行,但同样的 System.out.println() ——除此之外——我之前提到的其他内容被跳过。

问题实际上是方法sendOutput()跳过了。这才是真正磨砺我的齿轮。请帮忙。

我在麻省理工学院开发的名为 Processing 的环境中编程。据我所知,它只会在您的代码周围包装更多的 Java 代码。

在下面的代码片段下面我将解释为什么我认为通过 JIT 或 AOT 优化代码不是问题(最后我猜我会错。我希望相反,因为你不能将系统变量传递给处理来抑制优化)

  private void runConnectionHandler() {
    final BufferedReader inFromClient = getBufferedReader(socket);
    final DataOutputStream dataOutputStream = getDataOutputStream(socket);
    while (true) {   
      getInput(inFromClient);
      sendOutput(dataOutputStream);
      System.out.println("Cycle ends");
    }
  }


  private void getInput(final BufferedReader input) {
    System.out.println("Get");
    try {
      String clientSentence = null;
      if (input.ready()) {
        while ((clientSentence = input.readLine()) != null) {
          inputQueue.add(new GameData(clientSentence));
          System.out.println("Received se: \"" + clientSentence + "\"");
          System.out.println("1");
        }
        System.out.println("2");
      }
      System.out.println("3");
    } 
    catch (final Exception e) {
      e.printStackTrace();
    }
  }

  private void sendOutput(final DataOutputStream dataOutputStream) {
    System.out.println("Send");
    while (outputQueue.peek() != null) {
      try {
        String out = outputQueue.poll().toString();
        dataOutputStream.writeBytes(out + "\r\n");
        dataOutputStream.flush();
        System.out.println("Sent \"" + out + "\"");
      } 
      catch (final Exception e) {
        e.printStackTrace();
      }
    }
  }

输出:在第一个数据之前:

对优化一无所知,我认为它也应该在这里生效,但事实并非如此?

...
Get
3
Send
Cycle ends
...

输出:第一个数据到达

在“1”之后,输出停止。为什么是System.out.println("2"); 等等不执行?!为什么停了?!?!

...
Get
3
Send
Cycle ends    
Get
Received se: "SET PLAY MODE"
1

输出:手动发送更多数据

Gad dayium,我的意思是我的System.out.println("Get"); 和所有?!

...
Get
Received se: "SET PLAY MODE"
1
Received se: "Hey Ho1"
1

输出:服务器关闭

当我关闭另一端(服务器)时,每一行代码都会再次执行?!?!此外,它既不会停止,也不会引发执行(但可能是不同的问题)。

...
Get
3
Send
Cycle ends
...

另外,如果我的概念被严重破坏,我将不胜感激。

标签: javaoptimizationtcpjitaot

解决方案


推荐阅读