본문 바로가기

안드로이드/UMC 워크북

[Android] 4주차 워크북 - Thread

[Thread (4주차 주제)]

핵심 키워드 🎯

 

Thread

 정의 : Process 내에서 "순차적으로 실행되는 실행 흐름"

종류

Main UI Thread : UI 작업이 행해지는 스레드. 사용자 입력 이벤트를 처리하기 위한 루퍼(Looper) 에서 큐(Queue) 방식으로 이벤트를 발생 순서대로 전달받아 처리.

UI Thread : 시간이 오래 걸리는 작업을 행하는 스레드. 직접적인 UI 수정은 안되고, Handler, runOnUiThread 등을 통해 UI에 접근한다.

 

MessageQueue

Message 객체나 runnable 객체를 큐(Queue) 형태로 관리하는 자료구조.메시지 전달은 Handler 를 통해서, 그리고 큐로부터 메시지를 꺼내고 처리하는 역할은 Looper 가 수행한다. 앱의 Main Thread 에서 기본적으로 사용되고 있지만, 개발자가 MessageQueue 객체를 직접 참조해서 메시지를 전달하거나, 가져와서 처리하는 등의 과정은 하지 않는다.

 

Handler

Thread의 Looper 와 연결된 메시지 큐로 메시지를 보내고 처리할 수 있게 해 준다.

사용은 아래와 같은 방식으로 할 수 있다.

  • Message 객체 전달은 Handler(Looper.getMainLooper()).sendMessage(msg)
  • Runnable 객체 전달은 Handler(Looper.getMainLooper()).post(run : runnable)
inner class WorkerThread : Thread() { 
    override fun run() { 		
        Handler(Looper.getMainLooper()).post{
            ... 		
        } 	
    } 
}

 

 

Looper

무한하게 돌면서 Message Queue 에 들어있는 Message 객체나 Runnable 객체를 차례대로 가져와서 그와 연결된 Handler 를 호출하는 역할을 담당한다.

개발자들은 메인 스레드로 전달할 Messsage 객체나 Runnable 객체를 구성하고, 스레드의 Message Queue에 연결된 Handler 를 통해 해당 객체를 보내면 된다.

 

 

Thread 종료

interrupt() 함수를 통해 Thread에 interrupt 를 발생 시키거나, Thread를 상속받은 class 내부에서 run() 함수가 종료되면 Thread 가 종료된다.

 

 

 

 

 

논의해보면 좋은 것들 🔥

  • Thread 종료 후(interrupt) 다시 실행하고 싶으면 어떻게 해야할까?
  • Thread가 유용하게 쓰이는 것들 생각해보기
  • Thread의 문제점에 대해 알아보고 이를 해결할 방법(interrupt,join,AsynkTask 등)에 대해 알아보기

 

 

<참고 블로그>

Thread 관련 정리 : https://recipes4dev.tistory.com/143

Activity, Fragment 생명주기 : https://developer88.tistory.com/69