有沒有更好的方法來做我在下面做的事情?也就是說,是否有比投票和睡眠,投票和睡眠更優雅的方式,以便知道何時通過invokeLater()
調用了Runnable.run()
方法?等待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 Memory Model for V5 +)和2)輪詢通常是一個不好的解決方案,特別是在具有這種簡單的等待/通知機制的語言中(見Object.wait等)。 – 2010-05-10 19:15:23