我正在阅读并发文档,我无法理解它们的含义:
在applet中,必须使用invokeAndWait从init方法启动GUI创建任务;否则,init可能会在创建GUI之前返回,这可能会导致Web浏览器启动applet时出现问题。在任何其他类型的程序中,调度GUI创建任务通常是初始线程执行的最后一件事,因此无论是使用invokeLater还是invokeAndWait都无关紧要。'
- 在GUI创建之前返回init的问题是什么? - 为什么GUI创建通常是线程的最后一件事?
事件派发线程上的任务必须快速完成;如果他们不这样做,未处理的事件将备份,用户界面将无法响应。'
- 你怎么能让它更快完成?
- 以上例子中的EDT是什么?
SwingWorker worker = new SwingWorker<ImageIcon[], Void>() {
@Override
public ImageIcon[] doInBackground() {
final ImageIcon[] innerImgs = new ImageIcon[nimgs];
for (int i = 0; i < nimgs; i++) {
innerImgs[i] = loadImage(i+1);
}
return innerImgs;
}
@Override
public void done() {
//Remove the "Loading images" label.
animator.removeAll();
loopslot = -1;
try {
imgs = get();
} catch (InterruptedException ignore) {}
catch (java.util.concurrent.ExecutionException e) {
String why = null;
Throwable cause = e.getCause();
if (cause != null) {
why = cause.getMessage();
} else {
why = e.getMessage();
}
System.err.println("Error retrieving file: " + why);
}
}
};
- 为什么在这里初始化'工人',然后覆盖几种方法,而不仅仅是';'?我以前从未见过这种表示法...... - 所有不是'doInBackGround()'方法的方法,在事件派发线程下执行?
'SwingWorker的所有具体子类都实现了doInBackground;完成的实现是可选的。'
- 在代码示例中,我没有看到SwingWorker的子类,除非新的SwingWorker&lt;&gt;()被视为子类?
'从事件派发线程调用get的重载时要小心;直到返回,没有正在处理的GUI事件,并且GUI被“冻结”。除非您确信后台任务已完成或接近完成,否则不要在没有参数的情况下调用get。'
- 你会如何以非EDT的方式使用get()?
如果有些问题很明显,我很抱歉,谢谢你的时间!
答案 0 :(得分:1)
在创建GUI之前返回init有什么问题? - 为什么GUI创建通常是线程的最后一件事?
它在文中说它就在那里。 “这可能会给浏览器带来麻烦”。这可能是因为init的调用者需要该方法来创建GUI并为gui消息安排它,如果没有创建,则调用者失败。
如何让它更快完成?
这不是让线程运行得更快,而是如果你有一个长期任务,那就在后台线程而不是事件(GUI)线程中进行,以免它冻结。
上例中的EDT在哪里?
它无处可去.. applet有一个EDT,当你点击按钮或以其他方式与applet交互时使用它。我在这里真的不明白你的问题。
为什么在这里初始化'worker'然后覆盖几种方法而不仅仅是';'?我以前从未见过这种符号...... - 所有方法都不是'doInBackGround()'方法,在事件调度线程下执行?
这是SwitchWorker类的anonymous class declaration。不,doInBackground
不在EDT上执行,而是在后台执行。然而,done
计划在美国东部时间。请参阅http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html以供参考。
在代码示例中,我没有看到SwingWorker的子类,除非新的SwingWorker&lt;&gt;()被视为子类?
确实如此。
你如何以非EDT方式使用get()?
如文件所述:
get()
如果需要等待计算完成,然后检索其结果。
所以你不应该在后台方法完成之前调用它,以避免冻结GUI。