我有一个用 Swing 实现的 UI。一个组件执行一些可能需要一些时间的工作,因此我使用 SwingUtilities.invokeLater
。但是,我在阅读一些旧代码时在 ActionListener
中发现了这个:
if (!SwingUtilities.isEventDispatchThread()) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// code X
}
});
} else {
// code X
}
我认为这是有道理的,因为它将 code X
与 EDT 分开。但是,我发现它很容易出错,因为我已经使用了几次,而且两次都忘记了 else
部分。
问题是:是否需要检查 SwingUtilities.isEventDispatchThread()
?或者我可以假设我不在 EDT 中并且总是使用invokeLater
吗?
非常感谢。
最佳答案
即使您在 EDT 上,稍后调用也没有问题,但是它肯定会改变事件的时间安排,因此您必须确保在 EDT 上时您不依赖于此处的代码顺序。也就是说,避免忘记 else 的一个简单方法是将调用包装在一个实用方法中:
public static void invokeInDispatchThreadIfNeeded(Runnable runnable) {
if (EventQueue.isDispatchThread()) {
runnable.run();
} else {
SwingUtilities.invokeLater(runnable);
}
}
这样你就永远不会忘记 else
。
此外,一般来说,在您的惯用语中重复 code x
是一个非常糟糕的主意,因为稍后您可能会发现您必须修复或改进该代码,而且您只会在一个地方进行,在另一个中留下错误。
关于java - 检查线程是否需要 EDT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2684049/