티스토리 뷰

728x90

 


Thread

• 프로그램(앱)을 실행하는 흐름.

• 우리가 오버라이드하여 정의한 onCreate, onResume 등의 생명주기들을 순서대로 실행하는 주체.

• 쓰레드는 여러 작업을 동시에 하기 위해 언제든지 필요에 따라 추가되고 제거될 수 있다.

     - 하지만 프로그램을 실행시키는 하나의 쓰레드는 무조건 필요하다. -> Main Thread (메인 쓰레드)

     - 쓰레드의 추가, 제거는 다른 쓰레드에서 행해진다.

     - 둘 이상의 쓰레드가 동시에 작업을 수행하는 것을 Multi Thread(멀티 쓰레드)라고 한다.

 

1. Main Thread

• 최초로 실행되며 무조건 실행된다.

• 두 번째 쓰레드는 필연적으로 무조건 메인 쓰레드에서 생성된다.

     - 세 번째 쓰레드부터는 메인 쓰레드에서 생성될 수도, 다른 쓰레드에서 생성될 수도 있다.

 

2. Android에서의 Main Thread

• 화면을 그리는 역할을 담당 -> UI Thread라고도 불린다.

• 메인 쓰레드가 아닌 다른 쓰레드는 화면을 그릴 수 없다.

     - 쓰레드는 서로 독립적이기 때문에 여러 쓰레드가 화면 그리기를 담당하면 순서나 역할이 꼬일 수 있다.

     - 다른 쓰레드에서 UI 작업을 할 경우 해당 작업이 자동으로 메인 쓰레드 Queue로 넘어간다.

          -> 메인 쓰레드가 바쁘지 않으면 잘 실행되고, 바쁘면 에러가 날 수 있다.

          -> 사용하지 않는 것이 좋다.

• 다른 언어의 경우 메인 쓰레드가 처음 시작할 main 함수를 정의하거나 해야할 때가 많다.

     - 안드로이드에서는 mainfest에 main 액션, launcher 카테고리를 입력하면 안드로이드 프레임워크가 알아서 실행해준다.

 

3. 코틀린 Thread 클래스

• Thread.currentThread()로 현재 쓰레드를 확인할 수 있다.

package com.example.fastcampus

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

class Thread_12 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_thread12)

        // 쓰레드를 확인할 수 있다.
        val currentThread = Thread.currentThread()
        Log.d("testt", "" + currentThread)
    }
}

현재 쓰레드는 메인 쓰레드이다.

 

• 멀티 쓰레드 이용

package com.example.fastcampus

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

class Thread_12 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_thread12)

        // 쓰레드를 확인할 수 있다.
        val currentThread = Thread.currentThread()
        Log.d("testt", "" + currentThread)

        // 쓰레드를 하나만 썼을 때
        for(a in 1..1000) {
            Log.d("testt", "a : " + a)
        }
        for(b in 1..1000) {
            Log.d("testt", "b : " + b)
        }
    }
}

쓰레드를 하나만 썼을 때는 a 반복문이 모두 출력되고 b 반복문이 실행된다.

 

package com.example.fastcampus

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

class Thread_12 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_thread12)

        // 쓰레드를 확인할 수 있다.
        val currentThread = Thread.currentThread()
        Log.d("testt", "" + currentThread)

        // 쓰레드를 두 개 썼을 때
        Thread {
            for(a in 1..1000) {
                Log.d("testt", "a : " + a)
            }
        }.start()
        Thread {
            for(b in 1..1000) {
                Log.d("testt", "b : " + b)
            }
        }.start()
    }
}

멀티 쓰레드로 실행하면 a 반복문과 b 반복문이 서로 독립적으로 동시에 실행된다.

 

* 멀티 쓰레드를 사용하면 관리해야 할 흐름이 여러 개가 되어 관리가 힘들고, 그 흐름들 모두 독립적으로 실행되기 때문에 실행 순서를 예측할 수 없다. 

-> 조심히 사용하여야 한다.

 

 

 

 

 

 

 

 

 

이 글은

패스트 캠퍼스 Android 앱 개발의 정석 with Kotlin 올인원 패키지 Online

강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.

 


728x90
댓글
공지사항