Java プログラムのメイン メソッドで while ループを実行しています。ループは、ブール値フラグ変数がプログラムの keyPressed メソッドで true に設定されるまで実行されることになっています (プログラムを KeyListener として JFrame に追加しました)。
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class ThreadWhile implements KeyListener {
private boolean flag = false;
public static void main(String[] args) {
//Set up key listening on a dummy JFrame
JFrame frame = new JFrame("Key Detector 9000");
frame.setVisible(true);
ThreadWhile tw = new ThreadWhile();
frame.addKeyListener(tw);
System.out.println("Looping until flag becomes true...");
while(!tw.flag) {
//Commenting the println out makes the loop run forever!
System.out.println(tw.flag);
}
System.out.println("Flag is true, so loop terminated.");
System.exit(0);
}
public void keyPressed(KeyEvent e) {
flag = true;
System.out.println("flag: " + flag);
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}
keyPressed メソッドは独自のスレッドで実行されることを理解しているため、キーを押すと、変数 'flag' を true に設定し、main メソッドで実行されている while ループを終了する必要があるようです。
ただし、このプログラムを実行すると、'flag' 変数が正しく true に設定されていることがわかりますが、ループは永久に実行されます! 奇妙なことに、while ループ内に「flag」変数の System.out.println エコーをすばやく挿入すると、プログラムは正しく動作しますが、明らかにループ内で何も出力したくありません。
この問題は、Java コンパイラが「フラグ」変数のチェックを実際に停止するポイントまで空の while ループを最適化しようとした結果である可能性があると推測しています。これを正しく機能させるための提案、または keyPressed スレッドが実行されるまでメインスレッドを一時停止させるためのより気の利いた同時実行ベースのアプローチを誰かが提案していますか?
ありがとう!