Nuke Olaf - Log Store

[Android] 안드로이드 - 안드로이드에서 쓰레드란 본문

Android

[Android] 안드로이드 - 안드로이드에서 쓰레드란

NukeOlaf 2019. 12. 27. 21:16

What is thread in Android?

쓰레드 개념을 자바하면서 배웠던거 같은데 이제 다시 공부하려니까 막막하고 생각이 잘 안난다. 안드로이드에서 쓰레드가 무엇인지 알아보자

 

1. Thread의 사전적 의미 찾기

thread 

A long, thin strand of cotton, nylon, or other fibers used in sewing or weaving.

A theme or characteristic, typically forming one of several, running throughout a situation or piece of writing.

실, (이야기 등의) 가닥을 의미한다.

https://www.lexico.com/en/definition/thread

 

2. IT 사전에서 말하는 Thread란??

쓰레드란, 프로세스 내에서 순차적으로 실행되는 실행흐름의 최소 단위를 말한다.

일반적으로 하나의 프로세스는 하나의 스레드를 가지고 작업을 수행한다.

 

여기서, 멀티 스레드와 멀티 프로세스의 차이점을 인지하고 넘어가야함.

멀티 스레드란 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 말한다.

멀티 프로세스란 여러개의 CPU 를 사용하여 여러 프로세스를 동시에 수행하는 것을 말한다.

 

즉, 내가 음악재생 프로그램을 실행하고, 문서 작성 프로그램을 실행한다고 생각했을때, 음악재생 프로세스 내에서 가사가 움직이고, 싴바가 움직이는 실행들은 스레드라고 생각할 수 있고, 음악재생과 문서작성은 프로세스라고 생각할 수 있다는 것.

 

참고 사이트>>

http://tcpschool.com/java/java_thread_multi

https://recipes4dev.tistory.com/143

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

 

그럼, 안드로이드 개발자 문서에서 말하는 프로세스와 스레드에 대해서 알아보자

https://developer.android.com/guide/components/processes-and-threads

기본적으로, 한 어플리케이션 내의 모든 컴포넌트들은 같은 프로세스 내에서 동작해야한다. 물론, 필요한 경우에는 컴포넌트들이 각자 다른 프로세스에서 실행되게 할 수 있다고 한다.

어플리케이션이 launch 되면, 안드로이드 시스템은 해당 어플리케이션의 main thread 를 생성한다. 이 main thread 는 굉장히 중요한데, 이 쓰레드는 UI 위젯들을 그리는 역할을 수행하기 때문이다. 또한, 이 쓰레드는 UI 와 상호작용할 때 사용된다. 이렇게, main thread는 UI 를 그리고 상호작용하는 역할과 밀접한 관련이 있기 때문에 UI thread 라고도 불린다. 그러나, 특정 상황에서는 메인 쓰레드가 UI 쓰레드가 아닐 수도 있다.

안드로이드 시스템은 어플리케이션을 구성하는 각 컴포넌트 객체마다 쓰레드를 생성하지 않는다. 동일한 프로세스 내에서 실행되는 모든 컴포넌트들은 UI 쓰레드에서 인스턴스화 되며, 각 컴포넌트들에 대한 호출은 UI 쓰레드에서 실행된다. 결과적으로, 시스템 콜백에 응답하는 메소드들은 항상 프로세스의 UI 쓰레드에서 실행되는 것이다.

Specifically, if everything is happening in the UI thread, performing long operations such as network access or database queries will block the whole UI.

그러나, 만약 모든 일들이 UI 쓰레드에서만 처리되는 경우, 네트워크 접근이나 데이터베이스를 쿼리해오는 긴 작업을 수행하게 되면 모든 UI 가 블록되는 현상이 발생한다. UI 쓰레드가 블록되면, 그리기 이벤트와 같은 모든 이벤트들이 실행되지 않는다. 그렇게 되면 사용자 입장에서는 어플리케이션이 죽은 것처럼 보이고, 심지어 UI 쓰레드가 5초 이상 블록되면 ANR "어플리케이션이 응답하지 않음" 다이얼로그가 표시되게 된다.

안드로이드 어플리케이션은 단일 스레드 모델이다. 그러나, UI 쓰레드가 아닌 다른 쓰레드에서는 UI 를 건드릴 수가 없다. 그래서 UI 쓰레드가 블록되지 않도록 하는 것이 중요하다. UI 쓰레드가 블록되면 화면에 UI 가 그려지지 않기 때문. 그래서 즉각적이지 않은 수행작업이 있는 경우에는 별도의 다른 스레드에서 작업을 수행해야한다.

안드로이드에서는 다른 쓰레드에서 UI 쓰레드에 접근할 수 있는 방법을 제공해준다. 

fun onClick(v: View) {
    Thread(Runnable {
        // a potentially time consuming task
        val bitmap = processBitMap("image.png")
        imageView.post {
            imageView.setImageBitmap(bitmap)
        }
    }).start()
}

 

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            // a potentially time consuming task
            final Bitmap bitmap =
                    processBitMap("image.png");
            imageView.post(new Runnable() {
                public void run() {
                    imageView.setImageBitmap(bitmap);
                }
            });
        }
    }).start();
}

 

To handle more complex interactions with a worker thread, you might consider using a Handler in your worker thread, to process messages delivered from the UI thread. Perhaps the best solution, is to extend the AsyncTask class, which simplifies the execution of worker thread tasks that need to interact with the UI.

이렇게, implementation 하면 ImageView 가 UI 쓰레드에서 조작되면서, 백그라운드 작업이 별도의 쓰레드에서 작동된다. 그러나, 작업이 복잡해지면 이런식의 코드는 관리가 어렵고 복잡해진다. 이것보다 복잡한 상호작용을 구현하고 싶다면, worker thread 에서 Handler 를 사용하면 된다. Handler 이외에도 AsyncTask 클래스를 확장하여 사용하면 UI 쓰레드와 상호작용하는 worker thread 실행을 단순화할 수 있다.

AsyncTask 는 UI 에 비동기적인 작업을 수행할 수 있게 해준다. AsyncTask 는 개발자가 쓰레드를 직접 다루거나 handler 를 사용하지 않고도, worker 쓰레드를 블록하고 UI 쓰레드에 결과를 게시할 수 있게 한다. AsyncTask 를 사용하기 위해서는 AsyncTask 의 서브클래스에서 백그라운드 쓰레드에서에서 동작하는 doInBackground() 콜백 메서드를 implement 해야한다. UI 를 업데이트하기 위해서는 onPostExecute() 메서드를 implement 해야한다. onPostExecute() 메서드는 doInBackground() 메서드에서 처리된 결과를 UI 쓰레드에 전달하는 역할을 한다. 이로 인해 안전하게 UI 를 업데이트할 수 있다. 마지막으로 UI 쓰레드에서 excute()를 호출하여 AyncTask 작업을 시작하게 된다.

AsyncTask 안드로이드 developer 문서>>

https://developer.android.com/reference/android/os/AsyncTask.html

 

 

3. 그래서 Thread 란 무엇인데?

스레드에 대해 알기 위해, 우리는 프로세스라는 것에 대해 먼저 알아야 한다. 컴퓨터에서 프로그램을 실행하면, 그것은 프로세스가 된다. 예를 들어서 내가 노트북으로 크롬을 실행시켰다고 생각해 보자. 노트북의 하드디스크에 저장되어 있던 크롬 실행 파일은, 내가 크롬을 실행시킴에 따라 메모리() 올라가게 된다. 이렇게 프로그램이 메모리 위에 올라간 상태를 프로세스라고 말한다. 이러한 프로세스는 모두 최소 이상의 스레드를 가지고 있다. 크롬을 실행시키면, 하나가 생성되는데, 이것이 바로 스레드이다.

만약 내가, 크롬 하나를 열어서 두개의 탭을 열어놓은 상태라면, 이것은 스레드가 개인 상태, 멀티스레딩 중인 상태이다. 한개의 탭으로는 네이버 메일을 열어놓고, 한개의 탭에서는 지메일을 열어놓는다고 생각해보자. 네이버 메일 페이지는 프로그램된 어떤 절차에 따라 메일 알람, 광고창, 뉴스 등의 정보가 새로고침된다. 지메일 페이지 또한 네이버 메일 페이지와 마찬가지로 프로그램 어떤 흐름에 따라 자기 역할을 차례대로 수행할 것이다. 또한, 내가 크롬 탭을 띄워놓았으므로, 이들은 각자 자기의 역할을 동시에 수행하고 있을 것이다. 이것이 바로 스레드의 기본적인 개념이다. 방금 설명한 것은 작업관리자를 통해서도 확인할 있을것이다.

크롬탭으로도 이해가 안된다면, 엑셀 프로그램을 예로 들어 생각해 수도 있다. 엑셀 프로그램을 여는 것은 하나의 프로세스이다. 엑셀 프로그램을 실행하면, 바로 하나의 시트가 생기는데, 이것이 바로 스레드이다. 하나의 프로세스는 반드시 하나 이상의 스레드를 가진다.

프로세스의 스레드는 메인스레드, 최초로 진행되는 시부터 끝까지의 공간이 있다. 여기에 다른 스레드가 추가되면, 이것은 서브 스레드라고 한다.

스레드의 다른말은 multi-tasking이라고도 한다. 사람을 예로 들어보면, 사람을 프로세스라고 가정할때, 심장이 뛰는것은 스레드이고, 눈을깜빡거리는 것도 스레드이고, 숨을 쉬는것도 스레드이다. 만약 스레드가 없다면, 또는 단일 스레드로 모든것이 이루어져 있다면, 사람은 말을 할때는 심장을 뛰지 못하고, 눈을 깜빡이는 동안에는 숨을 쉬지 못할것이다.

스레드가 없는 상황을 게임에서 예를 들어보면, 만약 내가 메이플스토리를 하고 있는 상황에서 친구들과 파티를 맺고 보스몬스터를 사냥한다고 생각해보자. 스레드가 없다면, 내가 체력이 깎인 상황에서 물약을 먹어야할때, 친구들은 보스몬스터를 때릴 없고, 보스몬스터도 나를 포함한 모든 몬스터들을 때릴 없다. 또한, 보스몬스터가 나를 포함한 친구들을 공격할때, 우리는 어떤 대응도 없고, 몬스터의 공격이 끝날 때까지 기다려야 한다.

자동차로 예를 들어보면, 자동차가 주행하는 동안에는 에어컨을 수가 없다. 자동차에서 라디오를 동안에는 달리거나 에어컨을 켤수 없다. 비상 깜빡이를 키려면 다른 모든 행동들을 멈춰야한다. 브레이크도 밟을 없다. 자동차가 달리는 것이 멈춰야 브레이크를 밟을 있다.

 

4. 안드로이드에서 Thread 를 사용하는 이유

안드로이드에서 쓰레드는 자바에서의 쓰레드와 비슷하다. 서브 쓰레드를 이용하면 메인 쓰레드에서 진행되는 코드흐름 이외에 다른 작업을 동시에 수행할 수 있다. 그러나, 안드로이드에서 UI 를 업데이트는 main Thread , 즉 UI 쓰레드에서만 진행되어야 한다. UI 를 메인 쓰레드 이외의 다른 쓰레드에서 처리하기 위해서 Handler 라는 개념이 나왔다. Handler 는 서브스레드에서 작업한 것들을 메시지 큐에 담아서 UI 쓰레드에 선입선출 방식으로 전달해주는 역할을 수행한다. 이러한 Handler 의 역할을 좀더 쉽게 해주는 것이 AsyncTask 라고 한다.

 

5. 안드로이드에서 Thread 는 어떻게 사용할까?

 

 

참고 사이트 >>

https://www.techotopia.com/index.php/A_Basic_Overview_of_Android_Threads_and_Thread_handlers

https://black-jin0427.tistory.com/176

https://academy.realm.io/posts/360andev-stacy-devino-async-tasks-threads-pools-executors-android/

https://www.toptal.com/android/android-threading-all-you-need-to-know

Comments