invokeAndWait Java

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

code1:

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);
}
}

code2:

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??

3 ответа

Решение

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

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

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

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

От Javadoc

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

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

Другие вопросы по тегам