Ho un ciclo while in esecuzione nel metodo principale del mio programma Java. Si suppone che il ciclo venga eseguito finché una variabile flag booleana non è impostata su true nel metodo keyPress del programma (ho aggiunto il programma come KeyListener a un JFrame).Mentre il ciclo non termina quando il flag è cambiato in thread diversi
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) {}
}
E 'la mia comprensione che keyPressed metodi vengono eseguiti nelle loro discussioni, così sembra come quando ho colpito un tasto, la variabile 'flag' deve essere impostata su true, e il ciclo durante l'esecuzione nel metodo main dovrebbe finire
TUTTAVIA, quando eseguo questo programma, il ciclo gira per sempre, anche se possiamo vedere che la variabile 'flag' è impostata su true! Stranamente, il programma si comporta correttamente se inserisco un rapido System.out.println echo della variabile 'flag' all'interno del ciclo while, ma ovviamente non voglio stampare nulla nel ciclo.
Sto indovinando che questo problema potrebbe essere il risultato del compilatore Java che tenta di ottimizzare il ciclo while vuoto fino al punto in cui si ferma effettivamente controllando la variabile 'flag'? Qualcuno ha suggerimenti per farlo funzionare correttamente, o forse alcuni approcci più concreti basati sulla concorrenza per fare in modo che il thread principale si interrompa fino a quando non viene eseguito il thread keyPressed?
Grazie!
Utilizzare custodito blocchi invece (http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html). Andare in loop e aspettarsi che qualcosa diventi realtà rovinerà le prestazioni della tua applicazione e la renderà insensibile. –