[Kotlin] 스레드와 루퍼

Taeyang Lee·2020년 9월 1일
0

Kotlin

목록 보기
6/10
  • 스레드(Thread) : 하나의 프로세스 상의 독립적인 실행 흐름
  • 프로세스(Process) : 시스템 상의 실행 중인 프로그램으로 각각 독립된 메모리 공간을 할당받는다.

하나의 프로세스는 멀티 스레딩을 지원한다. 다수의 스레드로 동시적 처리가 가능하다. 하나의 프로세스 안에서 동작하는 스레드들은 프로세스의 메모리 고간을 서로 공유할 수 있다.


안드로이드의 스레드는 ① 메인 스레드와 ② 백그라운드 스레드로 나눌 수 있다.
메인스레드는 1개만 존재하고, 백그라운드 스레드는 여러 개가 존재할 수 있다.

1. 메인 스레드 (UI 스레드)

안드로이드 시스템은 새로운 앱이 시작하면 새로운 리눅스 프로세스를 시작한다. 메인 액티비티를 비롯한 모든 컴포넌트는 단일 프로세스 및 메인 스레드에서 실행된다.

  • 메인 스레드 특징 및 제약사항
    ① 화면의 UI를 그리는 처리를 담당한다.
    ② 안드로이드 UI 툴깃의 구성 요소와 상호작용하고, UI 이벤트를 사용자에게 응답하는 스레드이다.
    ③ UI 이벤트 및 작업에 대해 수 초 내에 응답하지 않으면 안드로이드 시스템은 ANR(응용 프로그램이 응답하지 않음) 팝업창을 표시하다. 시간이 오래 걸리는 코드는 새로운 스레드를 생성해서 처리해야한다.

위 제약사항의 목적은 지속적이고 유연한 사용자 환경을 제공하는 것이다.

2. 백그라운드 스레드

백그라운드 스레드에서는 처리 시간을 미리 계산할 수 없는 작업의 처리가 권장된다.

백그라운드 스레드는 Thread 클래스를 상속받거나 Runnable 인터페이스를 구현해 생성할 수 있다.

  • Runnable 인터페이스 : 상송 관계에 있는 클래스도 구현할 수 있도록 지원하는 모델 (코틀린은 다중 상속을 허용하지 않는다.)

Runnable 인터페이스로 구현한 스레드는 익명 함수(람다식)로 변환이 가능하다.

  • Thread 객체로 스레드 구현
class WorkerThread : Thread() {
override fun run() {
	var i = 0
    	while (i < 10) {
        	i += 1
        	Log.i("WorkerThread","$i")
        }
}

  • Runnable 인터페이스로 스레드 구현 : 익명객체 구현
Thread {
	var i = 0
    	while (i < 10) {
        	i += 1
        	Log.i("WorkerThread","$i")
        }
}.start()
    


3. 메인 스레드와 백그라운드 스레드

백그라운드 스레드로 메인 스레드에 집중되는 코드를 분산하여 더 효율적인 앱을 만들 수 있다. 하지만, 백그라운드 스레드는 UI 구성 요소에 접근하면 안 된다는 제약사항이 있다.



4. 핸들러와 루퍼

  • 루퍼(Looper) : Message Queue에서 메시지, Runnable 객체를 차례로 꺼내 핸들러가 처리하도록 전달한다.
  • 핸들러(Handler) : 루퍼로부터 받은 메시지, Runnable 객체를 처리하거나 메시지를 받아서 Message Queue에 넣는 스레드 간의 통신장치이다.

루퍼는 MainActivity가 실행됨과 동시에 for문 하나가 무한루프 돌고 있는 서브 스레드라고 생각하면 된다. 이 무한루프는 대기하고 있다가 자긴의 큐에 쌓인 메시지를 핸들러에 전달한다.
핸들러는 루퍼를 통해 전달되는 메시지를 받아서 처리하는 일종의 명령어 처리기로 사용된다. 앱이 실행되면 자동으로 생성되어 무한루프를 도는 루퍼와 달리 핸들러는 개발자가 직접 생성해서 사용해야 한다.
메시지는 루퍼의 큐에 값을 전달하기 위해 사용되는 클래스로 Message 객체에 미리 정해둔 코드를 입력하고, 큐에 담아두면 루퍼가 핸들러에 전달한다.




(☞゚ヮ゚)☞ [참고서적] 이것이 안드로이드다 with 코틀린 / 고돈호 / 한빛미디어
profile
Tyangpedia

0개의 댓글