자바 병렬 프로그래밍 ch9
-
Upload
hyeonseok-choi -
Category
Technology
-
view
1.818 -
download
1
description
Transcript of 자바 병렬 프로그래밍 ch9
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을 홗용하면 단일 스레드 시스템
구현이 용이
– 작업 중단, 작업 상태 짂행, 작업 완료 등.