Tengo un ciclo while ejecutándose en el método principal de mi programa Java. Se supone que el ciclo se ejecuta hasta que una variable de indicador booleano se establece en verdadero en el método keyPressed del programa (agregué el programa como KeyListener a JFrame).Mientras el ciclo no finaliza cuando la bandera cambia en un hilo diferente
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) {}
}
Es mi entendimiento de que keyPressed métodos se ejecutan en sus propios hilos, por lo que parece cuando pulso una tecla, la variable 'bandera' se debe establecer en true, y el bucle mientras se ejecuta en el método main debería terminar
SIN EMBARGO, cuando ejecuto este programa, el ciclo se ejecuta para siempre, ¡aunque podemos ver que la variable 'flag' se está configurando en verdadero! Curiosamente, el programa se comporta correctamente si inserto un eco de System.out.println rápido de la variable 'flag' dentro del ciclo while, pero obviamente no quiero imprimir nada en el ciclo.
Supongo que este problema podría ser el resultado de que el compilador de Java intente optimizar el ciclo while vacío hasta el punto en que deja de verificar realmente la variable 'flag'? ¿Alguien tiene sugerencias para hacer que esto funcione correctamente, o tal vez algunos enfoques más ingeniosos basados en simultaneidad para hacer que el hilo principal se detenga hasta que se ejecute el subproceso keyPressed?
Gracias!
Use bloques en lugar vigilado (http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html). Looping y esperar que algo se vuelva cierto arruinará el rendimiento de su aplicación y la dejará sin respuesta. –