In questo esempio ho un semplice JFrame contenente un JButton con un ActionListener ad esso associato. Questo AcitonListener modifica semplicemente un flag booleano che dovrebbe consentire il completamento del programma.I loop while in Java non verificano le loro condizioni se non c'è il corpo?
public class Test {
public static void main(String[] args){
final boolean[] flag = new boolean[1];
flag[0] = false;
JFrame myFrame = new JFrame("Test");
JButton myButton = new JButton("Click Me!");
myButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("Button was clicked!");
flag[0] = true;
}
});
myFrame.add(myButton);
myFrame.setSize(128,128);
myFrame.setVisible(true);
System.out.println("Waiting");
while(!flag[0]){}
System.out.println("Finished");
}
}
questo non è mai stampe "finito", e dopo che il pulsante è stato fatto clic stamperà una volta
Waiting
Button was clicked!
Tuttavia, se modifico il ciclo while per leggere
while(!flag[0]){
System.out.println("I should do nothing. I am just a print statement.");
}
Questo funziona! La stampa sembra
Waiting
I should do nothing. I am just a print statement.
I should do nothing. I am just a print statement.
....
I should do nothing. I am just a print statement.
Button was clicked!
Finished
Capisco questo probabilmente non è il modo corretto di aspettare su un'azione, ma comunque Sono interessato a sapere perché Java si comporta in questo modo.
Date un'occhiata a questo http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ – 3kings