2011-04-25 1 views
7

내가 읽고있는 책에서 멀티 스레딩을 사용하는 GUI의 모든 예는 다음과 같습니다.Java의 EventQueue입니다. 왜 모든 것이 invokelater 메서드에 있어야합니까?

public static void main(String[] args) throws Exception 
{ 
    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      JFrame frame = new SomeKindOfFrame(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
     } 
    }); 
} 

(저는 EventQueue를 의미합니다). 하지만 메인 (EDT) 스레드에서 자동으로 실행되는 코드가 아닌가?

답변

6

데스크톱 GUI 응용 프로그램은 일반적으로 이런 방식으로 작동합니다. gui에는 하나의 스레드가 있고 나머지는 하나의 스레드가 있습니다. EventQueue을 사용하면 GUI 스레드가 다른 스레드에서 수행해야하는 작업을 지정할 수 있습니다.

+0

분명히 스윙에서 이것을 "단일 스레드 규칙"이라고합니다. 스윙 이벤트는이 작은 "Runnable()"인스턴스를 가져 와서 실행하는 이벤트 스레드에서 처리됩니다. –

+0

@ 워렌 P는 완전히 동의합니다. 나는 이것을 가장 쉬운 방법으로 설명하려고 노력했다. BTW, 문법 교정을위한 감사합니다. –

13

주 스레드는 EDT와 다릅니다. System.out.println(Thread.currentThread().getName()을 추가하면 Runnablerun() 메서드 내에서 mainmain()AWT-EventQueue-0 내에 출력하는 것을 볼 수 있습니다.

여기에 더 명확하게 설명 할 수있는 a discussion of the history of the single threaded rule in Swing입니다.

+1

+1 좋은 링크입니다. –