본문 바로가기
Computer Science/Mobile Programming

비동기 처리 스레드

by 이은선 2023. 1. 21.
728x90
SMALL

  메인 스레드

-스레드란, 프로세스 내에서 "순차적으로 실행되는 실행 흐름"의 최소 단위를 말합니다. 프로그램의 main() 함수로부터 시작되는 최초 실행 흐름 또한 하나의 스레드이며, 이를 메인 스레드라고 부릅니다.

-안드로이드 앱에서 메인 스레드는 메시지 큐(Message Queue) 수신을 대기하는 루프를 실행하며, 사용자 입력과 시스템 이벤트, 화면 그리기 등의 메시지가 수신되면 각 메시지에 매핑된 핸들러의 메서드를 실행합니다.

 

  멀티 스레드

-메인 액티비티 : 애플리케이션이 실행될 때 하나의 프로세스에서 처리한다. 이벤트를 처리하거나 필요한 메소드를 정의하여 기능을 구현하는 경우에도 동일한 프로세스 내에서 실행한다. 따라서 대기 시간이 길어지는 네트워크 요청 등의 기능을 수행할 때에는 화면에 보이는 UI도 멈춤 상태로 있게 되므로 이의 해결방안으로서 하나의 프로세스 안에서 여러 개의 작업이 동시 수행되는 멀티 스레드 방식을 사용한다.

-멀티 스레드 : 같은 프로세스 안에 들어 있으면서 메모리 리소스를 공유하게 되므로 효율적인 처리가 가능하다. 동시에 리소스를 접근할 경우 데드락(교착 상태)이 발생하게 된다.

 

 

 

  서비스 VS 스레드( 서비스와 스레드 차이)

서비스 사용 : 백그라운드 작업은 서비스로 실행하고 사용자에게는 알림 서비스를 이용해 알려준다. 만약 메인 액티비티로 결과값을 전달하고 이를 이용해 다른 작업을 수행하고자 한다면 브로드캐스팅을 이용하거나 하여 결과값을 전달할 수 있다.

스레드 사용 : 스레드는 동일 프로세스 내에 있기 때문에 작업 수행 결과를 바로 처리할 수 있다. 그러나 UI 객체는 직접 접근할 수 없으므로 핸들러(Handler) 객체를 사용한다.

 

액티비티 생성 -> 메인 스레드 (액티비티 하나가 메인 스레드), 액티비티가 죽으면 같이 죽음(리소스 등 사라짐)
 서비스 -> 액티비티에서 생성했지만, 액티비티와 무관하다. (액티비티가 죽어도 서비스는 살아있다.)

 

+) 서비스란 ?

안드로이드 서비스 UI없이 백그라운드에서 실행되는 기능을 말한다. 예를 들어 네트워크 통신,음악재생,I/O 작업등의 작업등이 해당된다. 서비스는 메인 스레드에서 실행된다. (서비스는 스레드가 아님, 별도의 프로세스도 아님)  서비스가 CPU 자원을 많이 소모하는 작업이라면 서비스 안에 스레드를 생성해서 작업하는게 좋다. 앱이 실행중일때만 필요한 기능이라면 스레드를 사용하는게 맞고, 앱이 실행 중이지 않을때 실행되어야 한다면 서비스를 이용해야 한다.  만약 부모 스레드가 더 이상 foreground가 아닐때에나, 그 스레드를 소유한 어플이 중지되었거나 관계없이 백그라운드에서 서비스가 계속 살아있으면서 일을 해야 하면 서비스로 구현한다.  그리고는 서비스내에서 스레드를 만들어 서비스가 수행해야 하는 작업을 스레드가 담당하도록 한다.  작업량이 많거나 작거나 관계없이 별도 스레드에서 하도록 한다.  만약 어플리케이션의 UI 스레드가 돌고 있다고 생각되면 Handler 클래스를 이용해도 되고, 잘 모르겠으면 BroadcastReceiver 클래스를 이용하여 어플리케이션 UI를 관장하는 스레드에게 접근한다.  BroadcastReceiver 클래스는 돌고 있지 않던 프로세스도 깨울 수 있다.  

 


 

◆ JAVA에서 스레드

메인 스레드 : 애플리케이션 객체인 액티비티, 브로드캐스트 수신자 등과 새로 만들어지는 윈도우를 관리하기 위한 메시지 큐(Message Queue)를 실행함.

메시지 큐 (Message Queue) : 순차적으로 코드를 수행함.

핸들러(Handler) : 메시지 큐를 이용해 메인 스레드에서 처리할 메시지를 전달하는 역할을 담당한다. 특정 메시지가 미래의 어떤 시점에 실행되도록 스케줄링 할 수 있다.

 

메시지 큐 안에 핸들러가 존재한다.

메시지 큐와 핸들러 사이에 looper가 존재한다.

 

-obtainMessage() : 호출의 결과로 메시지 객체를 리턴 받게 한다.

-sendMessage() : 메시지 큐에 넣는다.

-handleMessage() : 메소드에 정의된 기능이 수행된다. 코드가 수행되는 위치는 새로 만든 스레드가 아닌 메인 스레드가 된다.

-> 스레드에서 obtainMessage() 함수를 통해서 메시지 객체를 받아온 후에 sendMessage() 함수를 통해서 메시지 큐에 메시지를 보낸다. 그 후 핸들러로 메시지를 보낸 후에 handleMessage() 함수를 사용하여 메인 스레드에서 메시지를 처리한다.

 

◆ 스레드에서 데이터 주고 받는 방법 

핸들러 클래스: 메시지 전송 방법 이외에 Runnable 객체를 실행시킬 수 있는 방법을 제공한다.

Runnable 객체 : 새로 만든 Runnable 객체를 핸들러의 post() 메소드를 이용해 전달해주기만 하면 이 객체에 정의된 run() 메소드 내의 코드들은 메인 스레드에서 실행된다.

728x90
LIST

'Computer Science > Mobile Programming' 카테고리의 다른 글

안드로이드 메뉴  (0) 2023.01.21
프래그먼트  (0) 2023.01.21
안드로이드 액티비티 라이프 사이클  (0) 2023.01.21
인텐트  (0) 2023.01.21
안드로이드 뷰와 레이아웃  (0) 2023.01.21