본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Java Concurrency] GUI 앱

by 돼지왕 왕돼지 2017. 4. 28.
반응형

 [Java Concurrency] GUI 앱


backgroundTask, DeadLock, Done, executor, Future, futuretask, gui 는 왜 단일 스레드로 동작하는가, gui 앱, gui 프레임워크, gui 프레임웍, java concurrency, newcachedthreadpool, race condition, SwingWorker, [Java Concurrency] GUI 앱, 경쟁 조건, 다른 형태의 단일 스레드 서브 시스템, 단일 스레드, 단일 스레드 이벤트 큐, 대기 상태, 데드락, 데이터 공유 모델, 데이터 모델, 도우미 클래스, 모델, 백그라운드 스레드, 분할 데이터 모델, 블로킹, 순차적 이벤트 처리, 스레드 내부 생성 변경 사용, 스레드 안전, 스레드 안전한 데이터 모델, 스레드 제한, 스레드 제한 기법, 스윙, 스윙 컴포넌트, 스윙의 스레드 한정, 이벤트, 인터페이스, 일관성, 작업 완료 안내, 작업 중단, 작업 진행 상태 안내, 장시간 실행되는 gui 작업, 진행 상태 및 완료 알림, 짧게 실행되는 gui 작업, 화면 표시


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

-
대부분의 GUI 프레임웍이 단일 스레드로 동작하도록 돼 있다.
GUI 프레임웍에서 여러 개의 스레드를 사용하고자 하는 시도는 많았지만, 대부분 경쟁 조건(race condition)과 데드락(deadlock) 등의 문제가 계속해서 발생했다.
대부분의 프레임웍이 이벤트 처리용 전담 스레드를 만들고, 전담 스레드는 큐에 쌓여 있는 이벤트를 가져와
앱에 준비돼 있는 이벤트 처리 메소드를 호출해 기능을 동작시키는 단일 스레드 이벤트 큐 모델에 정착한 셈이다.


-
단일 스레드 GUi 프레임웍은 스레드 제한 기법으로 스레드 안전성을 보장한다.



* 9.1.1. 순차적 이벤트 처리

-
작업을 순차적으로 처리하는 방법의 단점이라면 특정 작업을 실행하는 데 시간이 오래 걸리는 경우
그 이후에 실행할 작업은 이전 작업이 끝날 때까지 오랜 시간을 기다려야 한다는 점이다.



* 9.1.2. 스윙의 스레드 한정

-
스윙의 단일 스레드 규칙 : 스윙 컴포넌트와 모델 객체는 이벤트 스레드 내부에서만 생성하고, 변경하고, 사용할 수 있다.



9.2. 짧게 실행되는 GUI 작업


-
오랜 시간 동안 실행되는 작업은 이벤트 스레드가 아닌 외부의 다른 스레드에서 실행하도록 해야 맞다.



9.3. 장시간 실행되는 GUI 작업


-
GUI 앱에서 시간이 오래 걸리는 작업을 처리하는 데는 newCachedThreadPool 메소드로 생성한 Executor 가 제격이다.
GUI 앱에서 시간이 오래 걸릴 작업을 기계적으로 대량 생성하는 일은 거의 없기 때문에
스레드 풀의 크기가 무한정 늘어날 가능성은 거의 없기 때문이다.



* 9.3.1. 작업 중단



* 9.3.2. 진행 상태 및 완료 알림

-
Future 인터페이스를 활용하면 장시간 실행되는 작업을 중단하는 일도 굉장히 간단하게 구현할 수 있었다.
FutureTask 클래스에 포함돼 있는 done 이라는 훅 메소드를 사용하면 작업이 끝났음을 알려주는 기능도 중단 기능처럼 간단하게 구현할 수 있다.



* 9.3.3. SwingWorker



9.4. 데이터 공유 모델


* 9.4.1. 스레드 안전한 데이터 모델



* 9.4.2. 분할 데이터 모델

-
데이터 모델을 여러 개의 스레드에서 공유해야 하는 경우라면 분할 데이터 모델을 사용하는 방법을 고려해보자.
스레드 안전하게 공유할 수 있는 데이터 모델을 만들어 사용하고자 할 때
대기 상태에 들어가는 블로킹 문제, 일관성 문제, 구현하기에 복잡하다는 이유 등이 있다면
스레드 안전한 모델 대신 분할 데이터 모델을 추천한다.



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




Summary


GUI 프레임웍은 거의 대부분 단일 스레드 서브 시스템으로 구현돼 있으며,
화면 표시 부분과 관련된 기능이 모두 이벤트 스레드에서 작업의 형태로 실행되도록 만들어져 있다.
장시간 실행돼야 할 작업이 있는 경우 이벤트 스레드가 하나밖에 없기 때문에
전체적인 사용자 인터페이스의 응답 속도가 떨어질 수밖에 없다.
따라서 장시간 실행될 작업은 이벤트 스레드가 아닌 백그라운드 스레드에서 실행시켜야 한다.

스윙에 포함돼 있는 SwingWorker 나 직접 구현해 본 BackgroundTask 와 같이
작업 중단, 작업 진행 상태 안내, 작업 완료 안내 등의 기능을 갖춘 도우미 클래스를 사용하면
GUI 프레임웍 내부에서 오래 실행되는 작업을 쉽게 처리할 수 있다.






반응형

댓글