2014-09-25 11 views
0

이 스레드의 실제 목적을 이해하려고합니다. 나는 책, 기사를 읽었지만, 어떤 EventQueue 스레드가 책임지고 있는지 명확히 밝히지 않았다. 나는 많은 예를 보았으며 때로는 이것이 사용되기도하고 때로는 사용되지 않는 경우도 있습니다. 이 스레드는 모든 GUI 작업 (예 : 창, 구성 요소 만들기, OS API 및 기타 항목의 네이티브 함수 호출)을 담당합니다. 그래서 GUI의 일부를 바꿀 때마다이 작업을 대기열에 전달해야합니다. 그래서 대기열 응용 프로그램을 사용하면 기본적으로 기본 스레드와 이벤트 발송 스레드 두 개의 스레드가 있습니다. 그래서 나는 모든 bussines 로직을 메인 스레드에서 수행하거나 메인에서 새로운 스레드를 생성하고 EventQueue의 모든 gui 연산을 수행해야한다 (예를 들어 테이블에 새 항목을 추가하고 레이블을 업데이트하는 목록에서 텍스트를 변경하는 등). 더 이상 나는 EventQueue에서 메인 윈도우 (class extends jframe)의 인스턴스를 생성해야합니까?Java Swing의 EventQueue.invokeLater

맞습니까? 그렇지 않으면 설명하십시오. 모두에게 미리 감사드립니다.

+2

모든 이벤트 _handlers_는 이벤트 처리기 스레드에서 호출됩니다. 따라서 버튼에 대한 액션 리스너를 작성하면 버튼을 클릭 할 때 actionPerformed() 메소드가 이벤트 핸들러 스레드에서 호출됩니다. 버튼의 액션이 상당한 시간이 걸리지 않는 것이라면 actionPerformed() 내에서 Swing 메소드를 직접 호출 할 수 있습니다. 이 경우에는 "invokeLater()"를 호출 할 필요가 없습니다. –

답변

2

당신이 그 요점을 가지고있는 것처럼 들리 네. 애플리케이션이 본질적으로 "순수 GUI"인 경우 EDT (Event Dispatch Thread는 EventQueue.invokeLater으로 전달되는 스레드를 실행하는 스레드 임)에서 모든 작업을 수행 할 수 있지만 EDT에 창을 만들어야합니다. 즉, main() 메서드에서 사용해야합니다. EventQueue.invokeLater 적어도 한 번.

GUI 객체의 모든 수신기가 EDT에서 통지되므로 일반적으로 처리기에서 EventQueue.invokeLater을 사용할 필요가 없습니다.

+0

예를 들어 EDT에서 JFrame을 만드는 경우 항목 추가와 같은 다른 모든 작업은 작업을 대기열에 전달하지 않고 수행 할 수 있습니까? EDT에서 메인 프레임이 생성되었으므로 앞으로의 모든 작업도 EDT에서 수행됩니까? – ketazafor

+0

'다른 것들'이 GUI 콜백으로 실행되는 한, 그렇습니다. 괜찮습니다. – davmac

3

EventQueue은 호스트 플랫폼의 GUI 리소스 (예 : single-threaded)에 의존해야하기 때문에 단일 GUI 스레드를 관리합니다. initial thread에서 비 GUI 코드를 실행할 수 있지만 공유 데이터에 대한 액세스는 사용자가 직접 동기화해야합니다. 검사 된 hereSwingWorker은 편리한 대안입니다.