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

Post on 14-Jan-2017

330 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

9. GUI 애플리케이션

yarn

GUI 프로그램의 이벤트 처리

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

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

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

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

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

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

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

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

app 이벤트 발생

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

또다른 데드락

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

순차적 이벤트 처리

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

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

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

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

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

스윙의 쓰레드 한정

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

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

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

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

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

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

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

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

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

invokeLater, invokeAndWait

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

짧게 실행되는 GUI작업

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

리스너

배경색

지정

버튼을 클릭 했을 때의 흐름

모델과 뷰

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

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

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

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

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

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

마우스

클릭 이벤트 발생

이벤트

리스너

테이블 모델

업데이트

테이블 변경

이벤트 테이블 변경

테이블 뷰

업데이트

장시간 실행되는 GUI 작업

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

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

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

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

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

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

작업 중단

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

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

진행상태 및 완료 알림

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

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

Swing worker

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

쓰레드 안전한 데이터 모델

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

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

분할 데이터 모델

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

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

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

요약

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

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

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

top related