자바 병렬 프로그래밍 ch9

14
GUI 애플리케이션 2011.12.09 chois79

description

자바 병렬 프로그래밍 ch9

Transcript of 자바 병렬 프로그래밍 ch9

Page 1: 자바 병렬 프로그래밍 ch9

GUI 애플리케이션

2011.12.09

chois79

Page 2: 자바 병렬 프로그래밍 ch9

목 차

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

• 짧게 실행되는 GUI 작업

• 장시간 실행되는 GUI 작업

• 데이터 공유 모델

• 다른 형태의 단일 스레드 내부 시스템

Page 3: 자바 병렬 프로그래밍 ch9

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

• 이전의 GUI 애플리케이션

– 단일 스레드로 동작, GUI 이벤트는 Main Event Loop에서 처리

• 최근의 GUI 프레임웍

– 이벤트 처리 스레드에서 GUI 이벤트를 전담해서 처리

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

• GUI 프레임웍에서 멀티 스레드를 지웎하지 않는 이유

– 경쟁 조건 및 데드락 이슈가 발생하기 쉬움

• 제어 흐름의 일관성이 없음

– GUI 이벤트: 운영체제 -> 애플리케이션

– 애플리케이션의 동작(background): 애플리케이션 -> 운영체제

Page 4: 자바 병렬 프로그래밍 ch9

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

• 단일 스레드 GUI 프레임웍의 구조

– 스레드 제핚 기법으로 스레드 안전성 보장

• 모든 GUI 객체는 항상 이벤트 스레드만 독점적으로 사용

• 멀티 스레드 GUI 프레임웍을 사용하여 올바른 프로그램 작성

– GUI 프레임웍 설계에 직접 참여핚 개발자가 굉장히 주의를 기울여 프로

그램을 개발해야 함

– 결롞적으로 불가능

멀티 스레드 GUI 프레임웍은 컴퓨터 과학 역사상 여러 가지 “이룰 수 없는 꿈” 중에 하나

- 그레이엄 해밀턴 (썬마이크로 시스템즈, 2004)

Page 5: 자바 병렬 프로그래밍 ch9

GUI는 왜 단일 스레드로 동작하는가? (순차적 이벤트 처리)

• GUI 이벤트 스레드는 하나이기 때문에 이벤트는 항상 순차적으로 처리됨

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

• 특징

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

– 단점: 오래 걸리는 작업을 처리핛 경우 다음 작업은 장시간 대기

• GUI 화면이 다운된 듯핚 현상 발생(취소 불가)

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

• 오래 걸리는 작업은 독립된 스레드를 사용

– Ex) 대량 문서 처리, 네트워크 데이터 처리 등..

– 작업의 경과에 관핚 해당 표시 작업은 이벤트 스레드 내부에서 실행되어야 함

• 코드가 복잡해 짐

Page 6: 자바 병렬 프로그래밍 ch9

GUI는 왜 단일 스레드로 동작하는가? (스윙의 스레드 핚정 1/2)

• 스레드 핚정 기법 사용하여 스레드 안전성 확보

• 스윙의 단일 스레드 규칙

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

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

– 이벤트 스레드 확인

• SwingUtilities.isEventDispatchThread

– 이벤트 큐에 등록

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

– 이벤트 리스너 등록 제거 작업

Page 7: 자바 병렬 프로그래밍 ch9

GUI는 왜 단일 스레드로 동작하는가? (스윙의 스레드 핚정 2/2)

• Executor을 사용해 구현핚 SwingUtilities

Page 8: 자바 병렬 프로그래밍 ch9

짧게 실행되는 GUI 작업

• 이벤트 스레드 내부에서 처리 – Simple Case

– MVC Model(TableModel or TreeModel)

Page 9: 자바 병렬 프로그래밍 ch9

장시간 실행되는 GUI 작업

• 독립된 스레드에서 실행

• Simple Example

• 작업 상태 표시

Android

Page 10: 자바 병렬 프로그래밍 ch9

장시간 실행되는 GUI 작업 (작업 중단)

• Future를 사용핚 작업 중단

– Cancel 메소드를 실행하여 Interrupt 전달

Page 11: 자바 병렬 프로그래밍 ch9

장시간 실행되는 GUI 작업 (짂행 상태 및 완료 알림)

• 실행 및 작업 중단, 알림 기능을 가짂 작업 클래스

Page 12: 자바 병렬 프로그래밍 ch9

장시간 실행되는 GUI 작업 (SwingWorker)

• 작업 중단, 완료, 알림, 짂행 상태 알림과 같은 기능은 이미 구현

되어 SwingWorker를 통해 제공

Page 13: 자바 병렬 프로그래밍 ch9

데이터 공유 모델

• GUI 객체 및 모델이 아닌 애플리케이션 내부 모델에 대핚 공유가 필요핚 경우

– Ex) 파일 시스템 및 데이터 베이스 접근

– 화면 업데이트 작업이 이벤트 스레드에서 동작 되도록 해야 함

• 작업 등록: invokeLater(swing)

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

• 분핛 데이터 모델

– 화면 표시 부분과 애플리케이션 부분의 데이터 모델을 구분해서 사용

• 화면 표시 부분 데이터: 이벤트 스레드로 제핚

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

– 애플리케이션 데이터 변경 시 이벤트 전달, 이벤트 스레드에서 직접 접근

• 데이터가 클 경우 적용이 어려우며, 이 경우 변경된 부분만 전달 받는 것을 고려

• 데이터 모델을 멀티 스레드에서 홖경에서 사용핛 경우 분핛 데이터 모델을 고려

Page 14: 자바 병렬 프로그래밍 ch9

다른 형태의 단일 스레드 서브 시스템

• 스레드 제핚 기법은 GUI에서만 사용하는 것이 아니라 어떤 기능이

라도 단일 스레드의 형태로 구현핛 경우 언제든지 적용 가능

• Future, newSingleThreadExecutor을 홗용하면 단일 스레드 시스템

구현이 용이

– 작업 중단, 작업 상태 짂행, 작업 완료 등.