1

我正在使用eclipse,当我正常运行它时,我在控制台中看不到打印语句,但是当我在调试模式下运行它时,我看到了。到底是怎么回事?这只发生在一些打印语句上(在服务器客户端学校项目的服务器端,两者都在本地主机上运行)。

private class GameDriver extends Thread { 
     private Board board; 

     public GameDriver() { 
        board = new Board(); 
     } 

     @Override 
     public void run() { 
         boolean twoActivePlayersAlreadyJoined = false; 
         while (!twoActivePlayersAlreadyJoined) { 
             twoActivePlayersAlreadyJoined = connector.activePlayers.size() >= 2; 
         } 
         System.out.println("Two players already connected, ready to start game"); 
         sendBoardStateToAll(); 
     }
}
4

3 回答 3

2

Eclipse 调试窗口显示从您的 Eclipse 实例启动的不同 JVM。

显示线程的 Eclipse 调试窗口

如果您在 Eclipse 中启动多个应用程序,那么调试窗口中也会显示多个 JVM。现在,如果您在调试窗口中选择其中一个 JVM,则输出控制台将更改为所选 JVM 的标准输出。

但是,如果没有调试模式,Eclipse 只会显示最后打印到标准输出的 JVM 控制台的标准输出。

于 2012-06-30T22:35:41.063 回答
0

connector.activePlayers.size()使它看起来像connector.activePlayers一个集合。它是线程安全的集合吗?(即使它不是一个集合,它是线程安全的吗?)如果不是,它可能connector.activePlayers.size()是不断返回0or 1,导致你的while循环永远旋转。如果发生这种情况,您可能会看到 CPU 使用率上升——是这样吗?System.out.println("foo")无论如何,您可以通过将 a放入while循环中轻松检查。

很可能是调试器正在插入同步点或以其他方式导致 CPU 寄存器、缓存等被刷新。这可以解释为什么您在System.out.println调试器中看到循环终止(以及输出),而不是在 JVM 更积极地优化优化的“正常”模式下。

于 2012-07-01T05:07:41.583 回答
0

问:我在使用eclipse,正常运行时在控制台看不到打印语句,但在debug模式下运行时,我看到了。到底是怎么回事?

从子线程写入的“printf”完全有可能保持缓冲,直到线程终止。在这种情况下,您将永远看不到它。

建议:

请改用“System.err.println()”。这使用无缓冲的 I/O。你可能会看到你所期望的一切。

于 2012-06-30T22:51:48.293 回答