Existe-t-il une manière plus élégante de faire ce que je fais ci-dessous? Autrement dit, existe-t-il un moyen plus élégant que l'interrogation et le sommeil, l'interrogation et le sommeil, et ainsi de suite pour savoir quand une méthode Runnable.run()
a été appelée via invokeLater()
?En attente de l'appel de invokeLater()
private int myMethod() {
final WaitForEventQueue waitForQueue = new WaitForEventQueue();
EventQueue.invokeLater(waitForQueue);
while (!waitForQueue.done) {
try {
Thread.sleep(10);
} catch (InterruptedException ignore) {
}
}
return 0;
}
private class WaitForEventQueue implements Runnable {
private boolean done;
public void run() {
// Let all Swing text stuff finish.
done = true;
}
}
Pour ce que ça vaut ce code échoue sur deux niveaux: (1) il est thread-safe pas parce que le fil d'attente ne peut jamais « voir » la mise à jour 'done' (voir le modèle mémoire de Java pour V5 +) et (2) l'interrogation est généralement une mauvaise solution, en particulier dans un langage qui a un mécanisme d'attente/notification si facile (voir Object.wait, et al). –