EventQueue 클래스

EventQueue 클래스

EventQueue는 플랫폼 독립적인 클래스로, 하위 peer 클래스와 신뢰할 수 있는 애플리케이션 클래스에서 발생한 이벤트를 큐에 쌓아요. 큐에서 이벤트를 꺼내서 해당 EventQueuedispatchEvent(AWTEvent) 메서드에 인자로 넘겨 디스패치하는 비동기 이벤트 디스패치 기계를 캡슐화해요.

출처: Java API Reference

본문

이 디스패치 기계의 세부 동작은 구현에 따라 달라져요. 다만 실제로 이 큐에 넣어진 이벤트(참고로 EventQueue에 게시되는 이벤트는 병합될 수 있어요)는 다음 규칙으로 디스패치돼요.

public class EventQueue
extends Object
  • 순차적으로 — 이 큐의 여러 이벤트가 동시에 디스패치되는 것은 허용되지 않아요.
  • 넣어진 순서대로AWTEvent AAWTEvent B보다 먼저 큐에 들어갔다면, BA보다 먼저 디스패치되지 않아요.

이벤트 디스패치 스레드

AWT에서 이벤트 디스패치는 단일 스레드(이벤트 디스패치 스레드, EDT)에서 처리돼요. EventQueue.invokeLater(Runnable)invokeAndWait(Runnable)를 쓰면 특정 코드를 이 스레드에서 실행하게 예약할 수 있어요. UI를 다루는 코드는 기본적으로 EDT에서 실행해야 안전해요.

주요 메서드

  • invokeLater(Runnable) — 지정한 실행 코드를 이벤트 디스패치 스레드에서 비동기로 실행해요.
  • invokeAndWait(Runnable) — 지정한 실행 코드를 이벤트 디스패치 스레드에서 실행하고 결과를 기다려요.
  • isDispatchThread() — 현재 스레드가 이벤트 디스패치 스레드인지 확인해요.
  • getMostRecentEventTime() — 최근 이벤트 발생 시각을 반환해요.
  • getCurrentEvent() — 현재 디스패치 중인 이벤트를 반환해요.

브라우저·컨텍스트 관련

일부 브라우저는 다른 코드 베이스의 애플릿을 별도 컨텍스트로 분리하고 경계를 세우는데, 이 경우 컨텍스트마다 EventQueue가 하나씩 생겨요. 다른 브라우저는 모든 애플릿을 같은 컨텍스트에 두므로 전역 EventQueue 하나만 사용해요. 이 동작은 구현에 따라 달라져요.

이벤트 디스패치 기계의 스레드 이슈에 대한 자세한 내용은 "AWT Threading Issues" 문서를 참고하세요.

더 알아보기