Android의 Thread 환경에 대해 알아보기
오늘은 Android의 Thread환경에 대해 알아보려 합니다, 이번 글에선 개념적인 내용에 대해 다룰 예정입니다!
Thread vs Process
본격적으로 내용을 정리하기 전에, Thread와 Process가 어떻게 다른지 간단하게 알아보고 넘어가도록 하겠습니다.
Process?
- 실행중에 있는 프로그램을 의미합니다.
- 스케줄링의 대상이 되는 작업(Task)과 일맥상통합니다.
- 하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 됩니다. 이 순간부터 프로세스라 불립니다.
- *바이너리코드: 우리가 작성한 코드를 컴퓨터가 인식할 수 있도록 0과 1로 변환된 이진코드를 의미합니다.
Thread?
- 프로세스 내에서 실행되는 여러 흐름의 단위를 의미합니다.
- 하나의 프로세스 내에서 실행되는 여러 흐름으로, 프로세스의 자원을 공유하여 사용합니다.
- 하나의 프로세스 내에서 두개 이상의 스레드가 동작하도록 프로그래밍 하는것을 멀티 스레드 프로그래밍이라 부릅니다.
- 스레드는 최소 하나의 스레드가 실행 중이어야만 다른 새로운 스레드를 만들 수 있습니다.
간단히 정리해보자면, Process를 여러 흐름으로 나누어 여러 작업을 동시에 진행하기 위해 사용하는 기술이 Thread라고 볼 수 있습니다.
Android의 Thread환경
이제 본격적으로 Android는 어떠한 Thread환경을 가지고 있는지 알아보도록 하겠습니다.
기본적으로 안드로이드는 Main스레드 (UI작업을 하는 스레드, UI 스레드라고도 불림)만을 갖는 Single Thread Model입니다.
이러한 안드로이드 환경에는 2가지 규칙이 있습니다.
- 메인 스레드를 block하지 말것
- 메인 스레드 이외의 스레드에서는 UI에 접근하지 말것
1번째 이유부터 살펴보도록 하겠습니다.
메인 스레드는 UI작업을 담당하는 스레드입니다, 때문에 만약 이 스레드가 block된다면, 사용자들은 UI가 가만히 멈춰있는 즉 앱이 중단된것 같은 화면을 보게 됩니다. 이는 굉장히 좋지 않은 유저 경험을 남길 수 있습니다. 따라서 Android에서는 메인 스레드가 특정 시간 이상 멈춰있게 된다면 ANR(Application Not Responding)에러를 발생시키고 앱을 중단시킵니다.
2번째 이유는 다음과 같습니다.
만약 다른 스레드(Worker Thread)에서도 메인 스레드와 같은 UI에 접근하려 하면 어떻게 될까요? 스레드는 동시에 여러 작업을 수행할 수 있기 때문에 만약 메인 스레드와 이외의 스레드(Worker Thread)에서 동시에 UI에 접근하여 텍스트를 변경하는등의 동작을 취한다면, 어떤 스레드의 텍스트로 UI를 변경해야할지 알 수 없어 충돌이 발생하게 됩니다.
이처럼 여러 스레드가 같은 프로세스 안에서 공유, 변경이 가능한 같은 자원에 접근하는 현상을 race condition, 경쟁상태라 부릅니다.
1번 문제를 해결하기 위해 장시간 소요되는 작업들은 다른 스레드를(Worker Thread)를 생성하여 작업해야하고, 2번 문제를 해결하기 위해 UI접근은 메인 스레드에서만 이루어져야 합니다. 하지만 Android앱에서는 장시간 걸리는 작업의 결과물을 바탕으로 UI에 변화를 주는 경우가 상당히 많습니다. 이를 해결하고자 Android에선 Handler와 Looper라는것을 통해 스레드간 통신을 할 수 있게 합니다. 다음 글에서는 Handler와 Looper가 어떤 값을 주고 받는지, 어떻게 통신하는지에 대해 알아보겠습니다.
마무리
오늘은 Android의 스레드 환경에 대해 간단하게 알아보았습니다, 글 읽어주셔서 감사합니다!
( 글에 대한 피드백은 언제나 환영입니다! )
'Android' 카테고리의 다른 글
[Android/Basic] 3. Activity의 State Changes 알아보기 (0) | 2024.08.21 |
---|---|
[Android/Basic] 2. Activity의 LifeCycle 알아보기 (3) | 2024.07.22 |
[Android/Basic] 1. Android 4대 컴포넌트 알아보기 (1) | 2024.07.22 |
[Android/Thread] 2. Thread간의 통신과정 알아보기 (1) | 2024.06.05 |
[Android] Firebase Remote Config 알아보기! (3) | 2024.03.14 |