안드로이드 앱 개발 프로젝트1

11일차 - 스레드 공부 노트 1

원준킹 2021. 1. 21. 20:32
  1. 스레드, 프로그램, 프로세스
  2. 1 프로그램과 프로세스
  • 프로그램 : 컴퓨터에 의해 실행되는 명령과 데이터의 집합
     저장 장치에 파일 형태로 저장 (하지만 테이프 같은 것도 사실 일종의 프로그램이다)
     CPU에 의해 메모리로 로딩, 실행

  • 컴퓨터 역사의 초기에는 컴퓨터가 동시에 하나의 프로그램만 실행 가능

  • 운영체제가 프로그램의 실행을 담당하기 시작
     하드웨어->프로그램 => 하드웨어->운영체제->프로그램
     물리적 공간(디스크) -> 논리적 공간(메모리)
     운영체제는 리소스 할당과 관리를 담당
     하나의 프로그램을 동시에 여러 개, 여러 개의 프로그램을 동시에 실행 가능

  • 프로세스 : 메모리에 로딩되어 실행 중인 프로그램

 

 

 

1.2 프로세스와 스레드

  • 프로세스가 실행되면 자신의 코드 시작점부터 종료지점까지 순차적인 실행 흐름을 가짐
     main() -> 종료
  • 스레드 : 하나의 코드 실행 흐름만으로 처리하기 힘든 동작을 구현할 때 프로세스 내에서 독립적인 실행 흐름
     멀티스레드 프로그래밍 : 한 프로세스 내에 두 개 이상의 스레드 동작하도록 프로그래밍

 

 

1.3 메인 스레드

  • 스레드는 프로세스 실행 중 기존에 실행 중인 스레드가 있으면 언제든지 만들어지고 실행될 수 있음
  • 메인 스레드 : 프로세스의 시작과 동시에 실행되는 스레드
  • 꼭 메인 스레드가 아니여도 스레드에서 스레드를 시작할 수 있지만 최초의 스레드인 메인 스레드에서 그 다음 스레드를 시작하는 것뿐

 

 

  1. 안드로이드 스레드
  • 안드로이드의 스레드 또한 자바 SDK에 포함된 API를 사용한다.
     Thread(java.lang.Thread)
  • 두가지 방법 존재
     Thread 클래스를 상속한(extends) 서브클래스 생성 후 run() 메서드를 오버라이드
     Runnable 인터페이스를 구현(implements)한 클래스 선언 후 run() 메서드를 작성

 

 

2.1 Thread 클래스 상속(extends)

 

 

2.2 Runnable 인터페이스 구현(implements)

 

 

2.3 Thread 와 Runnable의 차이

  • 일단 두 방법으로 구현하는 것에 성능상 차이점은 없다
  • Thread 클래스를 상속하는 방법은 run() 메서드를 제외하고 별도로 재정의가 필요할 것이 있을 때 유효하다
  • run()메서드 이외의 재정의할 기능이 없으면 Runnable 인터페이스를 구현하면 된다

 

 

 

 

3.안드로이드 앱의 메인 스레드

3.1 안드로이드 앱의 시작점

  • 일반적인 자바 프로그램은 시작점인 main() 함수가 존재하여 JVM이 프로그램을 실행 시 시작점인 main()함수를 찾아 실행시킨다
  • 안드로이드에서는 사용자가 main()함수를 구현할 일은 없다
  • 다만 메니페스트파일에서 액티비티 중 하나를 런처로 지정하면 앱의 시작점으로 만들 수 있다
  • 안드로이드 프레임워크에서 main()함수는 “android.app.ActivityThread” 클래스에 구현되어 있다

 

 

3.2 안드로이드 메인 UI 스레드

  • 보통 프로그램은 단발형으로 main() -> 끝으로 끝나지 않고 사용자의 입력이나 데이터 수신 같은 이벤트가 존재
  • 이걸 수행하기위해 메인스레드에서 루프를 계속 실행하면 입력을 계속 체크하느라 다른 작업은 못하고 메모리 낭비로 이어지기 때문에 메인스레드에서 이런 대기형 무한루프를 사용하는 것은 절대 지양
  • 그러면 어떻게 하느냐, 메시지 큐를 사용
     메시지 : 사용자 입력을 포함한 시스템의 모든 이벤트를 전달할 때 사용하는 객체
     메시지 큐 : 시스템 이벤트를 순서대로 처리하기 위함

 

 

3.3 안드로이드 메인 UI스레드의 중요한 역할 : 화면 그리기

  • 프레임워크가 수행해야할 가장 중요한 기능 중 하나인 GUI, 다양한 구성 요소들을 화면에 그리는 것
  • 프레임워크의 그리기 기능은 반드시 메인 UI스레드에서만 실행
     스레드마다 그리면 표시되는 순서가 의도한대로 되지 않음
     만약 실시간으로 GUI 변화를 주고 싶은 기능이 있을 때 다른 스레드에서 뷰를 호출하면 안됨

 

 

올바른 사용 사례

 

'안드로이드 앱 개발 프로젝트1' 카테고리의 다른 글

12일차 - AsyncTask가 맞나?  (0) 2021.01.22
12일차 - 스레드 공부 노트2  (0) 2021.01.22
10일차  (0) 2021.01.20
9일차 - 데이터 삽입 알고리즘 최적화  (0) 2021.01.19
8일차  (0) 2021.01.18