【发布时间】:2020-02-26 02:48:46
【问题描述】:
作为学习 SwingWorker 的一部分,我浏览了源代码,并在其中找到了以下代码。我对此有疑问。
private void doneEDT() {
Runnable doDone =
new Runnable() {
public void run() {
done();
}
};
if (SwingUtilities.isEventDispatchThread()) {
doDone.run();
} else {
doSubmit.add(doDone);
}
}
上面的 doneEDT 是从 SwingWorker 构造函数中调用的,如下所示,
public SwingWorker() {
Callable<T> callable =
new Callable<T>() {
public T call() throws Exception {
setState(StateValue.STARTED);
return doInBackground();
}
};
future = new FutureTask<T>(callable) {
@Override
protected void done() {
doneEDT();
setState(StateValue.DONE);
}
};
state = StateValue.PENDING;
propertyChangeSupport = new SwingWorkerPropertyChangeSupport(this);
doProcess = null;
doNotifyProgressChange = null;
}
问题
为什么done() 方法被包装在 doneEDT 方法中的Runnable 中? done() 方法可以直接调用,而无需将其包装在 Runnable 中,对吗?所以我在想把它包装在Runnable 里有什么好处?
于是我想到了这个问题。
【问题讨论】:
-
它似乎没有任何意义,因为它直接调用
run。 (通常,Runnable会被传递给其他一些上下文来执行,例如invokeLater。) -
但是 done() 方法可以直接从 doneEDT() 方法中调用,对吧?这也说得通吧?
-
我错过了
if;这就是区别。它可以将运行发送到线程外。 (在现代 Java 中,this::done会更清晰。) -
您所说的“它可以将运行发送到线程外”是什么意思?
-
检查
else中发生的事情。
标签: java swing future swingworker