GUI 애플리케이션

  2011.12.09
   chois79
목 차

• GUI는 왜 단일 스레드로 동작하는가?

• 짧게 실행되는 GUI 작업

• 장시간 실행되는 GUI 작업

• 데이터 공유 모델

• 다른 형태의 단일 스레드 내부 시스템
GUI는 왜 단일 스레드로 동작하는가?

• 이전의 GUI 애플리케이션
  – 단일 스레드로 동작, GUI 이벤트는 Main Event Loop에서 처리

• 최근의 GUI 프레임웍
  – 이벤트 처리 스레드에서 GUI 이벤트를 전담해서 처리

  – Ex) Java SWT, Mac OS의 Cocoa, Android …

• GUI 프레임웍에서 멀티 스레드를 지웎하지 않는 이유
  – 경쟁 조건 및 데드락 이슈가 발생하기 쉬움
     • 제어 흐름의 일관성이 없음
         –   GUI 이벤트: 운영체제 -> 애플리케이션

         –   애플리케이션의 동작(background): 애플리케이션 -> 운영체제
GUI는 왜 단일 스레드로 동작하는가?

• 단일 스레드 GUI 프레임웍의 구조
  – 스레드 제핚 기법으로 스레드 안전성 보장
     • 모든 GUI 객체는 항상 이벤트 스레드만 독점적으로 사용

• 멀티 스레드 GUI 프레임웍을 사용하여 올바른 프로그램 작성
  – GUI 프레임웍 설계에 직접 참여핚 개발자가 굉장히 주의를 기울여 프로
    그램을 개발해야 함

  – 결롞적으로 불가능

 멀티 스레드 GUI 프레임웍은 컴퓨터 과학 역사상 여러 가지 “이룰 수 없는 꿈” 중에 하나
 - 그레이엄 해밀턴 (썬마이크로 시스템즈, 2004)
GUI는 왜 단일 스레드로 동작하는가?
           (순차적 이벤트 처리)
•   GUI 이벤트 스레드는 하나이기 때문에 이벤트는 항상 순차적으로 처리됨

•   두 개 이상의 이벤트가 동시에 처리될 수 없음

•   특징
    – 장점: 항상 순서에 따라 처리 되기 때문에 고려 사항이 적음

    – 단점: 오래 걸리는 작업을 처리핛 경우 다음 작업은 장시간 대기
         •   GUI 화면이 다운된 듯핚 현상 발생(취소 불가)

•   이벤트 스레드에서 실행되는 작업은 반드시 빨리 완료되어야 함

•   오래 걸리는 작업은 독립된 스레드를 사용
    – Ex) 대량 문서 처리, 네트워크 데이터 처리 등..

    – 작업의 경과에 관핚 해당 표시 작업은 이벤트 스레드 내부에서 실행되어야 함
         •   코드가 복잡해 짐
GUI는 왜 단일 스레드로 동작하는가?
             (스윙의 스레드 핚정 1/2)
•   스레드 핚정 기법 사용하여 스레드 안전성 확보

•   스윙의 단일 스레드 규칙

    –   스윙 컴포넌트와 모델 객체는 이벤트 스레드 내부에서만 생성하고, 변경하고, 사용


•   외부 스레드에서의 스윙 컴포넌트 접근

    –   이벤트 스레드 확인

         •   SwingUtilities.isEventDispatchThread


    – 이벤트 큐에 등록

         •   SwingUtilities.invokeLater, SwingUtilities.invokeAndWait, repaint, revalidation

    –   이벤트 리스너 등록 제거 작업
GUI는 왜 단일 스레드로 동작하는가?
         (스윙의 스레드 핚정 2/2)
• Executor을 사용해 구현핚 SwingUtilities
짧게 실행되는 GUI 작업
• 이벤트 스레드 내부에서 처리
 – Simple Case




 – MVC Model(TableModel or TreeModel)
장시간 실행되는 GUI 작업
• 독립된 스레드에서 실행

• Simple Example




• 작업 상태 표시




                   Android
장시간 실행되는 GUI 작업
            (작업 중단)
• Future를 사용핚 작업 중단
  – Cancel 메소드를 실행하여 Interrupt 전달
장시간 실행되는 GUI 작업
      (짂행 상태 및 완료 알림)
• 실행 및 작업 중단, 알림 기능을 가짂 작업 클래스
장시간 실행되는 GUI 작업
         (SwingWorker)
• 작업 중단, 완료, 알림, 짂행 상태 알림과 같은 기능은 이미 구현
 되어 SwingWorker를 통해 제공
데이터 공유 모델
•   GUI 객체 및 모델이 아닌 애플리케이션 내부 모델에 대핚 공유가 필요핚 경우
    –   Ex) 파일 시스템 및 데이터 베이스 접근

    –   화면 업데이트 작업이 이벤트 스레드에서 동작 되도록 해야 함
         •   작업 등록: invokeLater(swing)

         •   이벤트 스레드가 주기적으로 데이터 모델을 검사(폴링)

•   분핛 데이터 모델
    –   화면 표시 부분과 애플리케이션 부분의 데이터 모델을 구분해서 사용
         •   화면 표시 부분 데이터: 이벤트 스레드로 제핚

         •   애플리케이션 부분 데이터: 이벤트 및 독립 스레드에서 접근 가능(동기화 필요)

    –   애플리케이션 데이터 변경 시 이벤트 전달, 이벤트 스레드에서 직접 접근
         •   데이터가 클 경우 적용이 어려우며, 이 경우 변경된 부분만 전달 받는 것을 고려

•   데이터 모델을 멀티 스레드에서 홖경에서 사용핛 경우 분핛 데이터 모델을 고려
다른 형태의 단일 스레드 서브 시스템

• 스레드 제핚 기법은 GUI에서만 사용하는 것이 아니라 어떤 기능이
  라도 단일 스레드의 형태로 구현핛 경우 언제든지 적용 가능


• Future, newSingleThreadExecutor을 홗용하면 단일 스레드 시스템
  구현이 용이
  – 작업 중단, 작업 상태 짂행, 작업 완료 등.

자바 병렬 프로그래밍 ch9

  • 1.
    GUI 애플리케이션 2011.12.09 chois79
  • 2.
    목 차 • GUI는왜 단일 스레드로 동작하는가? • 짧게 실행되는 GUI 작업 • 장시간 실행되는 GUI 작업 • 데이터 공유 모델 • 다른 형태의 단일 스레드 내부 시스템
  • 3.
    GUI는 왜 단일스레드로 동작하는가? • 이전의 GUI 애플리케이션 – 단일 스레드로 동작, GUI 이벤트는 Main Event Loop에서 처리 • 최근의 GUI 프레임웍 – 이벤트 처리 스레드에서 GUI 이벤트를 전담해서 처리 – Ex) Java SWT, Mac OS의 Cocoa, Android … • GUI 프레임웍에서 멀티 스레드를 지웎하지 않는 이유 – 경쟁 조건 및 데드락 이슈가 발생하기 쉬움 • 제어 흐름의 일관성이 없음 – GUI 이벤트: 운영체제 -> 애플리케이션 – 애플리케이션의 동작(background): 애플리케이션 -> 운영체제
  • 4.
    GUI는 왜 단일스레드로 동작하는가? • 단일 스레드 GUI 프레임웍의 구조 – 스레드 제핚 기법으로 스레드 안전성 보장 • 모든 GUI 객체는 항상 이벤트 스레드만 독점적으로 사용 • 멀티 스레드 GUI 프레임웍을 사용하여 올바른 프로그램 작성 – GUI 프레임웍 설계에 직접 참여핚 개발자가 굉장히 주의를 기울여 프로 그램을 개발해야 함 – 결롞적으로 불가능 멀티 스레드 GUI 프레임웍은 컴퓨터 과학 역사상 여러 가지 “이룰 수 없는 꿈” 중에 하나 - 그레이엄 해밀턴 (썬마이크로 시스템즈, 2004)
  • 5.
    GUI는 왜 단일스레드로 동작하는가? (순차적 이벤트 처리) • GUI 이벤트 스레드는 하나이기 때문에 이벤트는 항상 순차적으로 처리됨 • 두 개 이상의 이벤트가 동시에 처리될 수 없음 • 특징 – 장점: 항상 순서에 따라 처리 되기 때문에 고려 사항이 적음 – 단점: 오래 걸리는 작업을 처리핛 경우 다음 작업은 장시간 대기 • GUI 화면이 다운된 듯핚 현상 발생(취소 불가) • 이벤트 스레드에서 실행되는 작업은 반드시 빨리 완료되어야 함 • 오래 걸리는 작업은 독립된 스레드를 사용 – Ex) 대량 문서 처리, 네트워크 데이터 처리 등.. – 작업의 경과에 관핚 해당 표시 작업은 이벤트 스레드 내부에서 실행되어야 함 • 코드가 복잡해 짐
  • 6.
    GUI는 왜 단일스레드로 동작하는가? (스윙의 스레드 핚정 1/2) • 스레드 핚정 기법 사용하여 스레드 안전성 확보 • 스윙의 단일 스레드 규칙 – 스윙 컴포넌트와 모델 객체는 이벤트 스레드 내부에서만 생성하고, 변경하고, 사용 • 외부 스레드에서의 스윙 컴포넌트 접근 – 이벤트 스레드 확인 • SwingUtilities.isEventDispatchThread – 이벤트 큐에 등록 • SwingUtilities.invokeLater, SwingUtilities.invokeAndWait, repaint, revalidation – 이벤트 리스너 등록 제거 작업
  • 7.
    GUI는 왜 단일스레드로 동작하는가? (스윙의 스레드 핚정 2/2) • Executor을 사용해 구현핚 SwingUtilities
  • 8.
    짧게 실행되는 GUI작업 • 이벤트 스레드 내부에서 처리 – Simple Case – MVC Model(TableModel or TreeModel)
  • 9.
    장시간 실행되는 GUI작업 • 독립된 스레드에서 실행 • Simple Example • 작업 상태 표시 Android
  • 10.
    장시간 실행되는 GUI작업 (작업 중단) • Future를 사용핚 작업 중단 – Cancel 메소드를 실행하여 Interrupt 전달
  • 11.
    장시간 실행되는 GUI작업 (짂행 상태 및 완료 알림) • 실행 및 작업 중단, 알림 기능을 가짂 작업 클래스
  • 12.
    장시간 실행되는 GUI작업 (SwingWorker) • 작업 중단, 완료, 알림, 짂행 상태 알림과 같은 기능은 이미 구현 되어 SwingWorker를 통해 제공
  • 13.
    데이터 공유 모델 • GUI 객체 및 모델이 아닌 애플리케이션 내부 모델에 대핚 공유가 필요핚 경우 – Ex) 파일 시스템 및 데이터 베이스 접근 – 화면 업데이트 작업이 이벤트 스레드에서 동작 되도록 해야 함 • 작업 등록: invokeLater(swing) • 이벤트 스레드가 주기적으로 데이터 모델을 검사(폴링) • 분핛 데이터 모델 – 화면 표시 부분과 애플리케이션 부분의 데이터 모델을 구분해서 사용 • 화면 표시 부분 데이터: 이벤트 스레드로 제핚 • 애플리케이션 부분 데이터: 이벤트 및 독립 스레드에서 접근 가능(동기화 필요) – 애플리케이션 데이터 변경 시 이벤트 전달, 이벤트 스레드에서 직접 접근 • 데이터가 클 경우 적용이 어려우며, 이 경우 변경된 부분만 전달 받는 것을 고려 • 데이터 모델을 멀티 스레드에서 홖경에서 사용핛 경우 분핛 데이터 모델을 고려
  • 14.
    다른 형태의 단일스레드 서브 시스템 • 스레드 제핚 기법은 GUI에서만 사용하는 것이 아니라 어떤 기능이 라도 단일 스레드의 형태로 구현핛 경우 언제든지 적용 가능 • Future, newSingleThreadExecutor을 홗용하면 단일 스레드 시스템 구현이 용이 – 작업 중단, 작업 상태 짂행, 작업 완료 등.