자바병렬프로그래밍 9.gui 애플리케이션

21
9. GUI 애플리케이션 yarn

Upload: choonghyun-yang

Post on 14-Jan-2017

330 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 자바병렬프로그래밍 9.gui 애플리케이션

9. GUI 애플리케이션

yarn

Page 2: 자바병렬프로그래밍 9.gui 애플리케이션

GUI 프로그램의 이벤트 처리

• GUI관련 작업은 모두 단일 쓰레드에서 일어나는 single thread subsystem으로 구현.

• 일부는 이벤트 쓰레드에서 실행, 나머지는 일반 애플리케이션 쓰레드에서 실행.

• 이벤트 쓰레드와 일반 쓰레드를 구분하여 사용하지 못할 경우 여러가지 문제가 발생.

Page 3: 자바병렬프로그래밍 9.gui 애플리케이션

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

• 자바말고도 다른 프로그램(Qt, Nextstep, cocoa, X윈도우)에서 단일쓰레드로 동작.

• 단일 쓰레드를 벗어 날려고 했지만 경쟁조건, 데드락 문제가 계속 발생.

• 결국 대부분의 프레임웍이 이벤트 처리용 전담 쓰레드를 만들어서 처리 (자바는 event dispatch thread)

Page 4: 자바병렬프로그래밍 9.gui 애플리케이션

데드락상황에 빠지기 쉬운 상황

app 이벤트 발생

운영체제와 애플리케이션간 양방향으로 움직이는 과정을 거치면서 쓰레드가 안전하게 동기화 시키다보니 락이 잘못된 순서로 배치되면 데드락이 발생

Page 5: 자바병렬프로그래밍 9.gui 애플리케이션

또다른 데드락

• MVC (model – view – controller) 패턴을 사용하면서 모델 , 뷰 , 컨트롤러 구조를 사용하면 작업은 쉬울 수 있지만 락의 순서가 올바르지 않게 배치될 가능성이 높다.

Page 6: 자바병렬프로그래밍 9.gui 애플리케이션

순차적 이벤트 처리

• GUI는 마우스 클릭, 키보드 입력, 타임아웃등 세밀한 이벤트를 처리하는 기능위주로 만들게 된다.

• 스윙이나 AWT에서 이벤트 처리 구조는 Executor와 비슷하다.

• 이벤를 처리하는 쓰레드는 단하나 뿐이기에 항상 순차적으로 실행.

• 단점이라면 특정작업에 실행시간이 길어지므로 다른작업이 기다려야 한다.

• 작업이 길 경우 독립 쓰레드로 처리 하게 하여 이벤트 쓰레드의 제어권을 넘기도록 구현. (코드가 복잡 해질수있다.)

Page 7: 자바병렬프로그래밍 9.gui 애플리케이션

스윙의 쓰레드 한정

• Jbutton이나 Jtable와 같은 스윙 컴포넌트와 TableModel, TreeModel등의 데이터 모델은 이벤트 쓰레드에 한정되도록 만들어져있다.

• 항상 이벤트 쓰레드만 사용

• GUI 객체는 동기화 기법 대신 쓰레드 한정 기법으로 쓰레드 안정성을 확보한다.

• 이벤트 쓰레드 외부에서 절대 건드려서 안되는 단점.

Page 8: 자바병렬프로그래밍 9.gui 애플리케이션

이벤트 쓰레드 외부에서 호출 가능한 method

• SwingUtilities.isEventDispathThread – 현재 쓰레드가 이벤트인지 알려줌

• SwingUtilities.invokeLater – Runnable을 등록해 이벤트 쓰레드에서 실행되도록 처리.

• SwingUtilities.invokeAndWait – Runnable을 등록해 이벤트 쓰레드에서 실행되도록 처리 후 해당작업이 끝날때까지 대기.

• 화면을 다시 그리거나 재정비 하는 요청을 이벤트 큐에 쌓는 메소드 • 이벤트 리스너를 추가하거나 제거하는 메소드

Page 9: 자바병렬프로그래밍 9.gui 애플리케이션

invokeLater, invokeAndWait

Executor의 기능과 광장히 유사한 모습으로 동작. Executor 쉽게 구현도 가능.

Page 10: 자바병렬프로그래밍 9.gui 애플리케이션

짧게 실행되는 GUI작업

마우스 클릭 이벤트 발생 이벤트

리스너

배경색

지정

버튼을 클릭 했을 때의 흐름

Page 11: 자바병렬프로그래밍 9.gui 애플리케이션

모델과 뷰

• 스윙에서는 화면의 표시 객체가 모델과 뷰로 나뉘어진다.

• 화면에 표시 돼야 할 데이터는 모델에 보관.

• 데이터를 화면에 어떻게 표시 할지는 뷰에서 결정.

• 모델에서 갖고 있는 데이터가 변경 되면 이벤트가 발생.

• 뷰에서는 모델에서 발생하는 이벤트에 대한 리스너가 대기중.

Page 12: 자바병렬프로그래밍 9.gui 애플리케이션

모델과 뷰가 분리 됐을 때의 작업 흐름

마우스

클릭 이벤트 발생

이벤트

리스너

테이블 모델

업데이트

테이블 변경

이벤트 테이블 변경

테이블 뷰

업데이트

Page 13: 자바병렬프로그래밍 9.gui 애플리케이션

장시간 실행되는 GUI 작업

• Excutor를 직접 생성 하여 시간이 오래 걸리는 작업을 실행.

• GUI 에서 시간이 오래 걸리는 작업을 처리하는 데는 newCacheThreadPool 가 제격.

Page 14: 자바병렬프로그래밍 9.gui 애플리케이션

장시간 실행되는 작업 예제 #1

실행하고 관심을 끊어버리는 전략 (fire and forget)

Page 15: 자바병렬프로그래밍 9.gui 애플리케이션

장시간 실행되는 작업 예제 #2

작업의 결과를 화면에 표시하기

Page 16: 자바병렬프로그래밍 9.gui 애플리케이션

작업 중단

• 독립적인 쓰레드를 사용하는 경우 사용자가 취소하고 싶은 생각이 들때, 쓰레드 인터럽트를 기능 사용해 작업 중단기능을 구현

• Future의 cancel 메소드를 사용하면 쉽게 구현가능.

Page 17: 자바병렬프로그래밍 9.gui 애플리케이션

진행상태 및 완료 알림

• FutureTask에 done이라는 method를 사용하면 작업이 끝났음을 알려주는 기능도 쉽게 구현가능.

• Callable 작업이 완료되면 항상 done method가 호출된다.

Page 18: 자바병렬프로그래밍 9.gui 애플리케이션

Swing worker

• 스윙에서는 작업 중단, 작업 완료 알림, 작업 진행 상태 알림과 같은 기능에 대해서 Swing worker를 통해서 제공.

Page 19: 자바병렬프로그래밍 9.gui 애플리케이션

쓰레드 안전한 데이터 모델

• 특정 데이터를 놓고 여러 쓰레드가 동시에 동작하는 상황은 쓰레드에 안전한 데이터모델을 사용해 쉽게 해결.

• 사용하고자 하는 데이터 모델에서 동시 사용성을 높은 수준으로 지원한다면 응답속도 문제 없이 이벤트 쓰레드와 작업용 쓰레드에서 충분히 데이터 공유 가능.

Page 20: 자바병렬프로그래밍 9.gui 애플리케이션

분할 데이터 모델

• 화면 표시 부분과 애플리케이션 부분의 데이터 모델을 구분해서 사용하는 모양을 분할 데이터 모델이라고함.

• 화면 표시 부분의 데이터 모델은 항상 이벤트 쓰레드 내분에 제한.

• 애플리케이션의 모델은 이벤트 쓰레드와 애플리케이션 쓰레드와 동시에 사용 할 수 있기 때문에 쓰레드의 안정성을 고려한 구조를 갖고 있다.

Page 21: 자바병렬프로그래밍 9.gui 애플리케이션

요약

• GUI는 대부분 단일 쓰레드 서브 시스템으로 구현

• 화면 표시 부분과 관련된 기능은 모두 이벤트 쓰레드에서 작업.

• 장시간 작업은 백그라운드 쓰레드를 실행하여 처리.