티스토리 뷰
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)
}
}
}
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()
}
}
* 멀티 쓰레드를 사용하면 관리해야 할 흐름이 여러 개가 되어 관리가 힘들고, 그 흐름들 모두 독립적으로 실행되기 때문에 실행 순서를 예측할 수 없다.
-> 조심히 사용하여야 한다.
이 글은
패스트 캠퍼스 Android 앱 개발의 정석 with Kotlin 올인원 패키지 Online
강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.
'📱 Android > 💡 개념' 카테고리의 다른 글
[Android/개념] 14. Resource(리소스) (0) | 2022.11.07 |
---|---|
[Android/개념] 13. 동기(Synchronous) & 비동기(Asynchronous) (0) | 2022.11.04 |
[Android/개념] 11. Fragment(프래그먼트) (0) | 2022.11.03 |
[Android/개념] 10. Bundle(번들) (0) | 2022.11.03 |
[Android/개념] 9. Text Changed Listener (0) | 2022.11.02 |