그래서 내가 본 수많은 다른 GUI 자습서, 그들 모두가이 코드를 사용할 말했다 :javax.swing.SwingUtilities.invokeLater가 아닌가요?
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
을 내가 꽤 나는 GUI 다소 새로운 해요 이후이 정확히 무엇을 이해하지 수 있지만, 나는 그것이하는 일의 기초를 이해한다 ... 또는 그렇게 나는 생각했다. 그러나 실험으로, 나는 그것을 전부 버리고 방금 떠났습니다.
public static void main(String[] args) {
createAndShowGUI();
}
그리고 그것은 작동하는 것처럼 보였습니다. 이제 질문이 있습니다. 두 번째 코드를 사용하는 것보다 코드의 첫 번째 코드를 유지하는 목적은 무엇입니까? 필요하다면 사용하지 않으면 어떻게됩니까?
'invokeLater()'는 필요시 안정적으로 동작하도록 만듭니다. 이것은 매번 발생하지 않는 스레딩 버그이지만 일반적으로 최악의 시간에 발생합니다. – user949300
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html을 참조하십시오. 코드가 작동하는 것처럼 보이는 이유는 스레드 경주가 재현하기가 어렵 기 때문입니다. 하지만 프로그램이 복잡해질수록 스레딩 규칙을 준수하지 않으면 스레드 버그 * 어딘가에 충돌 할 확률이 높아집니다. – kiheru
언급했듯이 (그리고 다른 것들도 언급했듯이) 대부분의 경우에'invokeLater' * 없이는 작동하지 않을 것입니다. 그러나 나는 EDT에서 호출되지 않을 때 재현 가능한 * LookAndFeel을 사용했다는 것을 기억합니다. (이 경우 충돌은 API의 잘못된 사용이기 때문에 합법입니다.) – Marco13