2012-06-30 31 views
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(); 
    } 
} 
+0

您应该显示缺少printf的代码。也许这很容易,因为你不写一个换行符,因此输出不会被刷新 - 并且在你期望的时候不会出现。私人课程GameDriver延伸主题 – nos

+0

'''私人课程板; \t \t public GameDriver(){ \t \t \t board = new Board(); \t \t} \t \t @Override \t \t公共无效的run(){ \t \t \t布尔twoActivePlayersAlreadyJoined = FALSE; (!!)( \t \t \t while(!twoActivePlayersAlreadyJoined){ \t \t \t \t twoActivePlayersAlreadyJoined = connector.activePlayers.size()> = 2; System.out.println(“两个玩家已经连接,准备开始游戏”); \t \t \t sendBoardStateToAll(); \t \t} ''' – Trup

+2

请使用代码示例语法将代码添加到您的原始问题中,这样它就会[更]可读。 –

回答

2

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

Eclipse Debug Windows showing the threads

如果你开始在Eclipse中多个应用程序,那么就会出现在调试窗口中显示以及多个JVM。现在,如果在调试窗口中选择其中一个JVM,则输出控制台将更改为选定的JVM的标准输出。

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

+0

@nos看到我修改后的答案。 –

0

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

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

建议:

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

+0

这是有道理的,因为问题只发生在我有多线程的地方,但这并没有解决它。至少在控制台中,我仍然没有看到有问题的陈述的任何输出。任何其他想法? – Trup

0

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

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

相关问题