我在理解并发文档时遇到了问题

时间:2014-02-23 23:31:20

标签: java multithreading concurrency

我正在阅读并发文档,我无法理解它们的含义:

  

在applet中,必须使用invokeAndWait从init方法启动GUI创建任务;否则,init可能会在创建GUI之前返回,这可能会导致Web浏览器启动applet时出现问题。在任何其他类型的程序中,调度GUI创建任务通常是初始线程执行的最后一件事,因此无论是使用invokeLater还是invokeAndWait都无关紧要。'

- 在GUI创建之前返回init的问题是什么? - 为什么GUI创建通常是线程的最后一件事?

  

事件派发线程上的任务必须快速完成;如果他们不这样做,未处理的事件将备份,用户界面将无法响应。'

- 你怎么能让它更快完成?

http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TumbleItemProject/src/components/TumbleItem.java

- 以上例子中的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()?

如果有些问题很明显,我很抱歉,谢谢你的时间!

1 个答案:

答案 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。