EventQueue 클래스
EventQueue 클래스
EventQueue는 플랫폼 독립적인 클래스로, 하위 peer 클래스와 신뢰할 수 있는 애플리케이션 클래스에서 발생한 이벤트를 큐에 쌓아요. 큐에서 이벤트를 꺼내서 해당 EventQueue의 dispatchEvent(AWTEvent) 메서드에 인자로 넘겨 디스패치하는 비동기 이벤트 디스패치 기계를 캡슐화해요.
본문
이 디스패치 기계의 세부 동작은 구현에 따라 달라져요. 다만 실제로 이 큐에 넣어진 이벤트(참고로 EventQueue에 게시되는 이벤트는 병합될 수 있어요)는 다음 규칙으로 디스패치돼요.
public class EventQueue
extends Object
- 순차적으로 — 이 큐의 여러 이벤트가 동시에 디스패치되는 것은 허용되지 않아요.
- 넣어진 순서대로 —
AWTEvent A가AWTEvent B보다 먼저 큐에 들어갔다면,B가A보다 먼저 디스패치되지 않아요.
이벤트 디스패치 스레드
AWT에서 이벤트 디스패치는 단일 스레드(이벤트 디스패치 스레드, EDT)에서 처리돼요. EventQueue.invokeLater(Runnable)나 invokeAndWait(Runnable)를 쓰면 특정 코드를 이 스레드에서 실행하게 예약할 수 있어요. UI를 다루는 코드는 기본적으로 EDT에서 실행해야 안전해요.
주요 메서드
invokeLater(Runnable)— 지정한 실행 코드를 이벤트 디스패치 스레드에서 비동기로 실행해요.invokeAndWait(Runnable)— 지정한 실행 코드를 이벤트 디스패치 스레드에서 실행하고 결과를 기다려요.isDispatchThread()— 현재 스레드가 이벤트 디스패치 스레드인지 확인해요.getMostRecentEventTime()— 최근 이벤트 발생 시각을 반환해요.getCurrentEvent()— 현재 디스패치 중인 이벤트를 반환해요.
브라우저·컨텍스트 관련
일부 브라우저는 다른 코드 베이스의 애플릿을 별도 컨텍스트로 분리하고 경계를 세우는데, 이 경우 컨텍스트마다 EventQueue가 하나씩 생겨요. 다른 브라우저는 모든 애플릿을 같은 컨텍스트에 두므로 전역 EventQueue 하나만 사용해요. 이 동작은 구현에 따라 달라져요.
이벤트 디스패치 기계의 스레드 이슈에 대한 자세한 내용은 "AWT Threading Issues" 문서를 참고하세요.