Main Thread vs. Worker Thread

김태영·2024년 8월 9일
0

TIL

목록 보기
66/70
post-thumbnail

오늘 공부한 것

- 앱개발 심화 주차 특강
- 컴포즈 기본 Composable 사용
- 개인 과제 해설 보고 정리

개요

들어가기 전에 스레드와 프로세스에 대해 짧게 짚고 넘어가보자.

  • 프로세스: 실행 중인 프로그램의 단위, 프로그램은 CPU 자원을 할당 받아 프로세스가 된다.
  • 스레드: 한 프로세스 내에서 동시에 진행될 수 있는 작업의 단위, 하나의 실행 흐름/가닥

안드로이드에는 2 종류의 스레드가 있는데, 바로 Main Thread와 Worker Thread이다. 오늘은 이 둘의 차이점에 대해 알아보려고 한다.

Main Thread (UI Thread)

메인 스레드 혹은 UI 스레드라고 불리며 메인 스레드에서만 UI 작업을 해야한다. 여러 스레드에서 UI에 접근한다면 서로 다른 수정 사항을 요구했을 때 원하지 않은 결과를 초래할 수 있기 때문이다. 근데 이미 안드로이드는 메인 스레드가 아닌 스레드에서 UI 작업을 하려고 하면 에러를 발생시키기 때문에 개발할 때 큰 문제는 되지 않는다. 친절한 안드로이드..

ANR, Application Not Responding

어플리케이션이 응답하지 않는다는 에러이다. 갑자기 왜 이런 에러를 가져왔냐면, 메인 스레드와 연관이 있기 때문이다. 메인 스레드는 하나만 존재하며, 작업들을 순차적으로 진행한다. 즉, 앞선 작업이 끝나지 않았다면 그 다음 작업은 선행 작업이 끝날 때까지 대기해야 한다.

그런데 만약 앞선 작업이 1분, 혹은 더 오래 걸린다면? UI 작업을 처리하는 스레드가 곧 메인 스레드인데 그 긴 시간 동안 앱은 UI 작업을 못하게 되어 사용자의 상호작용에 아무런 응답을 할 수 없게 될 것이다. 다르게 말하면 UI 스레드가 오랜 시간 블로킹되었다고 할 수 있고, 이게 곧 ANR이 발생했다는 말과 같은 의미이다.

ANR 발생 조건으로는 다양한 상황과 다양한 조건들이 있지만 대략 5초 이상 앱이 반응하지 않을 때 발생한다고 한다.

말이 길어졌지만 결론은 메인 스레드에서는 시간이 오래 걸리는 작업을 하지 말자가 되겠다.

Worker Thread

시간이 오래 걸리는 작업은 바로 워커 스레드(작업 스레드)에서 처리하면 된다. 예를 들어 네트워크 통신이나 네트워크 통신이나 네트워크 통신 같은 작업이 있겠다!

그런데 워커 스레드 작업 중에 UI를 업데이트 해야 되는 일이 생길 수 있다. 이럴 때에는 HandlerrunOnUiThread 같은 함수를 사용해주면 된다.

  • Handler.post(): 스레드가 UI 스레드에게 뷰에 대한 작업을 요청할 수 있게 해준다.
  • Activity.runOnUiThread(): 현재 스레드가 UI 스레드라면 즉시 실행, 아니라면 UI 스레드의 자원 사용 이벤트 큐에 들어가게 된다.

정리

UI 작업은 메인 스레드! 시간이 오래 걸리는 작업은 워커 스레드!

profile
화이팅

0개의 댓글