我正在使用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 :(得分:2)
Eclipse调试窗口显示从Eclipse实例启动的不同JVM。
如果在Eclipse中启动多个应用程序,那么调试窗口中也会显示多个JVM。现在,如果您在调试窗口中选择一个JVM,则输出控制台将更改为所选JVM的标准输出。
然而,在没有调试模式的情况下,Eclipse只显示JVM控制台的标准输出,该控制台最后打印到标准输出。
答案 1 :(得分:0)
从子线程写入的“printf”完全可以保持缓冲,直到线程终止。在这种情况下,你永远不会看到它。
建议:
请尝试使用“System.err.println()”。这使用无缓冲的I / O.您可能会看到您期望的一切。
答案 2 :(得分:0)
connector.activePlayers.size()
使connector.activePlayers
看起来像是一个集合。它是一个线程安全的集合吗? (即使它不是一个集合,它是否是线程安全的?)如果没有,可能connector.activePlayers.size()
不断返回0
或1
,导致你{{1}循环旋转永远。如果发生这种情况,您可能会看到CPU使用率上升 - 是这样吗?无论如何,您可以通过在while
循环中放置System.out.println("foo")
来轻松检查。
很可能调试器正在插入同步点或以其他方式导致CPU寄存器,缓存等被刷新。这可以解释为什么你在调试器中看到循环终止(以及因此while
输出),而不是在JVM更积极地进行优化的“正常”模式中。