Есть ли более элегантный способ сделать то, что я делаю ниже? То есть, есть более элегантный способ, чем опрос и сон, опрос и сон, и так далее, чтобы знать, когда метод Runnable.run()
был вызван через invokeLater()
?Ожидание 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;
}
}
Для того, что бы этот код не выполнялся на двух уровнях: (1) он не является потокобезопасным, потому что ожидающий поток никогда не сможет «увидеть» обновление до «done» (см. Модель памяти Java для V5 +) и (2) опрос обычно является плохим решением, особенно на языке, который имеет такой простой механизм ожидания/уведомления (см. Object.wait и др.). –