invokeAndWait Java

Может ли кто-нибудь сказать мне, в чем фактическая разница между этими двумя кодами, поскольку они оба дают одинаковый результат?

код1:

public class JLabelDemo extends JApplet {
public void init() {
    this.setSize(400, 400);
    ImageIcon ii = new ImageIcon("Flock_icon.png");
    JLabel jl = new JLabel("<<--- Flock_icon", ii, JLabel.CENTER);
    add(jl);
}
}

код2:

public class JLabelDemo extends JApplet {
private static final long serialVersionUID = 1L;

public void init() {
    this.setSize(400, 400);
    try {
        SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                makeGUI();
            }
        });
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

private void makeGUI() {
    ImageIcon ii = new ImageIcon("Flock_icon.png");
    JLabel jl = new JLabel("<<--- Flock_icon", ii, JLabel.CENTER);
    add(jl);
}
}

Я действительно не нашел никакой разницы между сгенерированными выводами. Но я не могу понять код.

Так может ли кто-нибудь дать мне реальный пример метода invokeAndWait??


person Community    schedule 03.04.2013    source источник
comment
См. этот ответ - он связан с обработкой событий в Swing.   -  person thegrinner    schedule 03.04.2013
comment
Я думаю, вы не проверили другие ответы в SO. Проверьте эти ответы Answers1 и Ответ2   -  person Garry    schedule 03.04.2013


Ответы (3)


Для code1 2 выделения и добавление выполняются в любом потоке, вызывающем init(). Если это не поток диспетчеризации событий, то может возникнуть проблема, поскольку в документации Swing сказано, что почти все использование Swing должно выполняться в потоке диспетчеризации событий.

Для code2 вызовы Swing гарантированно выполняются в потоке отправки событий. Это правильный способ делать вещи. Это уродливо и сложно, и вы этого не понимаете (пока), но это правильный способ сделать что-то, если init() будет вызываться в любом потоке, кроме EDT.

person Theodore Norvell    schedule 03.04.2013
comment
Относительно того, почему может возникнуть проблема. И вот почему: Swing не написан потокобезопасным способом. Каждый раз, когда код Swing выполняется вне EDT, вы, вероятно, создаете состояние гонки. Замечательная вещь в условиях гонки заключается в том, что ваш код будет работать большую часть времени, но непредсказуемо выйдет из строя. Добро пожаловать в мир многопоточности. - person Theodore Norvell; 03.04.2013
comment
Спасибо за помощь gr8!! - person ; 03.04.2013

invokeAndWait означает, что он будет выполнять этот блок кода в отдельном потоке и поэтому не будет блокировать основной поток во время его выполнения. Он используется для создания графического интерфейса Swing.

person maloney    schedule 03.04.2013

Вы не увидите никаких различий в небольших приложениях Swing. В больших приложениях, где отрисовка пользовательского интерфейса занимает больше времени и/или в приложениях задействовано несколько потоков, вы можете увидеть различия.

Из javadoc

invokeAndWait вызывает синхронное выполнение doRun.run() в потоке диспетчеризации событий AWT. Этот вызов блокируется до тех пор, пока все ожидающие события AWT не будут обработаны и (затем) doRun.run() не вернется. Этот метод следует использовать, когда потоку приложения необходимо обновить графический интерфейс. Его не следует вызывать из EventDispatchThread.

Вы также можете проверить здесь.

person Abhinaba Basu    schedule 03.04.2013