[Android] 스레드(Thread)

2025. 6. 12. 21:40·Android

스레드(Thread)

스레드는 프로세스 내에서 실행되는 독립적인 실행 흐름, 즉 작업의 최소 단위이다.

모든 프로세스는 한 개 이상의 스레드가 작업을 실행한다. 이때, 한 프로세스에서 두 개 이상의 스레드가 동시에 동작하는 것을 멀티스레드라고 한다.

※ 프로세스(Process): 앱의 실행 단위

 


메인 스레드(UI Thread)

메인 스레드는 프로세스가 시작될 때 생성되며, UI 스레드라고도 불린다.

이름 그대로 메인 스레드에서는 앱의 UI를 그리는 작업을 담당한다.

 

이러한 메인 스레드는 주의해야 할 점이 있는데

 

1. UI 스레드를 차단하면 안된다.

파일 다운로드처럼 오래 걸리는 작업은 작업자 스레드에서 처리해야 한다.

위와 같은 작업을 메인 스레드에서 수행하면 ANR(Application Not Responding)이 발생하여 앱이 강제종료되기 때문이다!

 

2. UI 관련 코드는 반드시 UI 스레드에서 실행해야 한다.

작업자 스레드에서 UI 요소를 변경할 수 없다. 만약 UI 변경이 필요하다면 Handler나 runOnUiThread()로 UI 작업을 전달해야 한다.

 


작업자 스레드(Worker Thread)

파일 입출력, DB 작업과 같이 오래 걸리는 작업들은 백그라운드에서 또는 작업자 스레드에서 실행해야 한다.

위의 주의해야 할 점 2번을 구체적으로 살펴보자.

 

작업자 스레드에서 UI 스레드로 작업을 전달하려면 Handler, runOnUiThread()를 사용할 수 있다.

 

1. Handler

 

먼저 코드를 살펴보자.

val handler = Handler(Looper.getMainLooper())
Thread {
    for(i in ImageList) {
        Thread.sleep(1000)
        handler.post {
            binding.img.setImageResource(i) // UI 관련 작업
        }
    }
}.start()

 

스레드를 시작하면 새로운 백그라운드 스레드에서 Thread.sleep(100)이 비동기로 실행된다. 

또한 UI 관련 작업은 handler를 통해 메인 스레드로 post하여 처리할 수 있다. 

 

이처럼 Handler는 Looper를 통해 메시지 큐에 들어온 메시지나 Runnable을 전달 받아 작업을 처리한다.

 

2. runOnUiThread()

 

실행하고자 하는 코드를 메인(UI) 스레드에서 실행하도록 보장하는 함수이다.

전달받은 Runnable 객체를 메인 스레드에서 실행하며,

현재 스레드가 메인 스레드라면 → Runnable의 run()을 바로 실행하고,

메인 스레드가 아니라면 → 내부적으로 Handler의 post()를 실행한다.

 

[예제 코드]

Thread {
    for (i in imageList) {
        Thread.sleep(1000)
        runOnUiThread {
            binding.img.setImageResource(i) // UI 관련 작업
        }
    }
}.start()

 

이외에도 View.post()와 View.postDelayed() 방식도 존재한다!

 

3. View.post()

 

위 방식은 특정 View가 안전하게 UI 작업을 수행하기 위한 함수이다.

안전하게 UI 작업을 수행하려면, 해당 View가 UI에 attach된 후 자동으로 UI 스레드에서 Runnable이 실행되어야 한다.

 

다음 코드를 살펴보자.

fun onClick(v: View) {
    Thread(Runnable {
        val bitmap = processBitMap("image.png")
        imageView.post {
            imageView.setImageBitmap(bitmap)
        }
    }).start()
}

 

백그라운드에서 이미치 처리(오래 걸리는 작업)를 한 뒤 → imageView.post {...} 를 호출하면,

imageView에 대한 UI 변경 작업이 UI 스레드에서 안전하게 수행된다.

 

4. View.postDelayed()

 

View.postDelayed()는 View.post()와 동일하게 UI 스레드에서 Runnable이 실행되지만, 지정한 시간만큼 실행을 지연시키는 함수이다.

 

fun onClick(v: View) {
    Thread {
        val bitmap = processBitMap("image.png")
        imageView.postDelayed({
            imageView.setImageBitmap(bitmap)
        }, 2000) // 2000ms = 2초 후 실행
    }.start()
}

 

 위와 동일한 코드이지만 2초 후 UI 스레드에서 imageVIew의 이미지를 변경한다.

 

:)

 

출처

https://developer.android.com/guide/components/processes-and-threads?hl=ko#Processes

https://goodbegunishalfdone.tistory.com/entry/Android-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%8A%A4%EB%A0%88%EB%93%9C#Main%20Thread(%EA%B8%B0%EB%B3%B8%20%EC%8A%A4%EB%A0%88%EB%93%9C)-1

https://angxxu.tistory.com/34

'Android' 카테고리의 다른 글

[Android] 클린 아키텍처(Clean Architecture)  (2) 2025.08.11
[Android] Work Manager(+Job Scheduler)  (2) 2025.08.09
[Android] 안드로이드 권장 아키텍처  (4) 2025.07.31
[Android] Fragment의 데이터 통신  (1) 2025.06.16
[Android] 안드로이드의 4대 컴포넌트  (0) 2025.06.11
'Android' 카테고리의 다른 글
  • [Android] Work Manager(+Job Scheduler)
  • [Android] 안드로이드 권장 아키텍처
  • [Android] Fragment의 데이터 통신
  • [Android] 안드로이드의 4대 컴포넌트
jjangsudiary
jjangsudiary
jjangsudiary 님의 블로그 입니다.
  • jjangsudiary
    jjangsudiary 님의 블로그
    jjangsudiary
  • 전체
    오늘
    어제
    • 분류 전체보기 (81) N
      • 이모저모 (0)
        • 회고 (0)
      • Development (17) N
        • 개발 공부 (14) N
        • 프로젝트 (2)
      • Android (10)
        • Compose (1)
      • AI (15)
      • Computer Science (25)
        • 네트워크 (8)
        • 데이터베이스 (10)
        • 운영체제 (6)
        • 자료구조 (0)
        • 컴퓨터구조 (1)
      • Java (9)
        • 디자인패턴 (2)
      • Spring (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    인공지능
    Python
    baekjoon
    TensorFlow
    os
    java
    안드로이드
    프로그래머스
    딥러닝
    db
    머신러닝
    코딩 테스트
    CS
    Ai
    android
    파이썬
    운영체제
    database
    자바
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
jjangsudiary
[Android] 스레드(Thread)
상단으로

티스토리툴바