2013-04-03 2 views
3

Может ли кто-нибудь сказать мне, какова фактическая разница между этими двумя кодами, поскольку они оба дают одинаковый результат?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); 
} 
} 

Кодекса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?

+0

См. [This] (http://stackoverflow.com/a/5500371/264775) ответ - это связано с тем, как события обрабатываются в Swing. – thegrinner

+0

Я думаю, что вы не проверили другие ответы в SO. Проверьте эти ответы [Ответы1] (http://stackoverflow.com/questions/7196889/swingutilities-invokelater) и [Ответ2] (http://stackoverflow.com/questions/5499921/invokeandwait-method-in-swingutilities) – Garry

ответ

2

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

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

+2

As почему * может быть проблемой. Вот почему: Swing не написан безопасным потоком. Каждый раз, когда Swing-код выполняется с EDT, вы, вероятно, создаете условие гонки. Замечательная вещь о гоночных условиях заключается в том, что ваш код будет работать большую часть времени, но будет непредсказуем. Добро пожаловать в мир многопоточности. –

+0

thanx для помощи gr8 !! – 2013-04-03 13:08:26

1

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

0

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

От Javadoc

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

Вы также можете проверить here.