使用多个线程时的标准输出

时间:2012-06-30 22:24:48

标签: java eclipse multithreading

我正在使用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(); 
     }
}

3 个答案:

答案 0 :(得分:2)

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

Eclipse Debug Windows showing the threads

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

然而,在没有调试模式的情况下,Eclipse只显示JVM控制台的标准输出,该控制台最后打印到标准输出。

答案 1 :(得分:0)

问:我正在使用eclipse,当我正常运行它时,我在控制台中看不到打印的语句,但是当我在调试模式下运行时,我看到了它。发生了什么事?

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

建议:

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

答案 2 :(得分:0)

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

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