有没有更好的方法来做我在下面做的事情?也就是说,是否有比投票和睡眠,投票和睡眠更优雅的方式,以便知道何时通过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