1

私はEclipseを使用しています.Eclipseを通常に実行すると、コンソールに出力されたステートメントは表示されませんが、デバッグモードで実行すると表示されます. 何が起こっている?これは、一部の print ステートメントでのみ発生します (両方ともローカル ホストで実行される、サーバー クライアントの学校プロジェクトのサーバー側で)。

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 の 1 つを選択すると、出力コンソールが選択した JVM の標準出力に変わります。

ただし、デバッグ モードがない場合、Eclipse は、最後に標準出力に出力された JVM コンソールの標準出力を表示するだけです。

于 2012-06-30T22:35:41.063 に答える
0

Q: Eclipse を使用していますが、通常どおり実行するとコンソールに出力されたステートメントが表示されませんが、デバッグ モードで実行すると表示されます。何が起こっている?

子スレッドから書き込まれた「printf」が、スレッドが終了するまでバッファリングされたままになる可能性は十分にあります。その場合、あなたはそれを見ることはありません。

提案:

代わりに「System.err.println()」を試してください。これは、バッファリングされていない I/O を使用します。期待どおりのものがすべて表示される場合があります。

于 2012-06-30T22:51:48.293 に答える
0

connector.activePlayers.size()connector.activePlayersコレクションのように見せます。スレッドセーフなコレクションですか? (そして、それがコレクションでなくても、それはスレッドセーフですか?) そうでない場合は、常にorをconnector.activePlayers.size()返している可能性があり、その結果、ループが永久に回転します。これが発生している場合、CPU 使用率が急上昇している可能性があります。それは事実ですか? とにかく、 aをループに入れることで簡単に確認できます。01whileSystem.out.println("foo")while

デバッガーが同期ポイントを挿入しているか、CPU レジスターやキャッシュなどがフラッシュされている可能性があります。これは、デバッガーでループの終了 (したがって出力) が表示される理由を説明できSystem.out.printlnますが、JVM が最適化に対してより積極的な「通常」モードでは表示されません。

于 2012-07-01T05:07:41.583 に答える