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.
Вы также можете проверить здесь.