[GUI/Thread] invokeLater(), invokeAndWait()

포키·2023년 3월 23일
0

국비과정

목록 보기
46/73
  • GUI(AWT, Swing)는 기본적으로 thread-safe하지 않음 (동기화 지원하지 않음)
    권고사항 - 멀티스레드 상태로 GUI에 접근하지 말 것
  • GUI에 발생하는 이벤트는 EventDispatchThread가 처리
  • 이벤트가 발생하면 발생한 요구사항이 EventQueue에 쌓이고, 선입선출 순서로 실행.

new JFrame()의 문제

JFrame이라는 스윙 컴포넌트를 main thread가 처리
멀티쓰레드(main, EDT) 상태 -> 데드락, 동기화 문제 발생 가능
앞으로는 EDT가 스윙 컴포넌트를

SwingUtilities 메서드

invokeLater(Runnable doRun) : 비동기 방식 'be executed asynchronously'
invokeAndWait(Runnable doRun) : 동기 방식 'be executed synchronously' - join()과 유사한 결과

  • 둘 다 실행한 쓰레드가 Runnable 객체를 이벤트 큐에 집어넣음 (할 일을 EDT에 전달)

  • invokeAndWait은 run() 동작이 수행되는 걸 기다림
    invokeLater는 run() 동작이 수행되는 걸 기다리지 않음 - 백그라운드 작업에 사용

  • 예시 그림

  • invokeAndWait은 우리가 사용할 일은 거의 없음

  • invokeAndWait은 EDT 안에서 사용x, InterruptedException 발생 가능

profile
welcome

0개의 댓글