반응형

앱을 실행하면 프로세스라는 것이 하나 만들어집니다.

하나의 프로세스가 하나의 앱을 실행시켜준다고 볼 수 있는데요, 그 안에서는 스레드라는 것이 동작합니다.

그런데 스레드는 프로세스 안에서 여러 개 만들어질 수 있고 각각의 스레드는 독립적으로 실행될 수 있습니다.

이런 스레드의 속성은 표준 자바와 다르지 않습니다.

만약 자바를 해본 적이 있다면 스레드에 대해 잘 이해하고 있겠죠?

그런데 표준 자바에서와 다른 점이 있습니다.

바로 핸들러라는 것을 사용해야 하는 경우가 많다는 것이죠.

핸들러가 무엇이고 어떤 경우에 어떻게 사용해야 하는지 알아봅시다.



스레드와 핸들러  

스레드는 동시 작업을 위한 한 단위입니다.

앱을 실행하면 하나의 스레드가 시작되는데 이것을 메인 스레드라고 부를 수 있습니다.

바로 앱의 기본 실행을 담당하고 있죠.

그런데 여러분이 원할 때마다 새로운 스레드가 만들어질 수 있습니다.

새로 만든 스레드는 메인 스레드와 별개로 실행될 수 있고 독립적인 실행이 가능하기 때문에 자주 사용됩니다.

표준 자바를 공부했다면 안드로이드에서 스레드가 동작하는 방식은 표준 자바와 동일하다고 할 수 있습니다.

다만 한 가지 차이점이 있는데 메인 스레드에서 관리하는 UI 구성요소를 접근할 때는 핸들러가 반드시 사용되어야 한다는 점입니다.

그 이유는 UI나 파일과 같은 리소스는 여러 개의 스레드가 동시에 접근했을 때 시스템에서 어떤 것을 먼저 처리해야 하는지 모르는 문제가 발생할 수 있기 때문입니다.

이 때문에 핸들러라는 것이 만들어져 있습니다.

핸들러는 각각의 스레드 안에 만들어질 수 있고 다른 스레드에서 요청하는 정보를 순서대로 실행시켜 줄 수 있기 때문에 리소스에 대한 동시 접근의 문제를 해결해 줍니다.

순서대로 접근한다는 것은 내부적으로 큐를 사용한다는 것은 충분히 짐작할 수 있을 겁니다.

핸들러 사용

스레드에서 핸들러로 메시지를 보내려면 Message 객체를 사용합니다.

Message 객체를 obtainMessage 메소드로 참조한 후 sendMessage 메시지를 이용해 핸들러로 보내면 handleMessage 메소드가 자동으로 호출되기 때문에 전달된 Message 객체를 처리할 수 있습니다.

이 때 handleMessage 메소드는 메인 스레드에서 실행됩니다.

다만 이 과정이 세 단계를 거치면서 복잡하게 느껴질 수 있기 때문에 좀 더 간단한 방법들이 만들어져 있습니다.

 

Post 메소드 호출

핸들러의 post 메소드를 호출하면 Runnable 객체를 전달할 수 있습니다.

핸들러로 전달된 Runnable, 객체는 메인 스레드에서 실행될 수 있으며 따라서 UI를 접근하는 코드는 Runnable 객체 안에 넣어두면 됩니다.

handler.post(new Runnable {
    public void run() {
    ...
    }
);

post 메소드 이외에도 지정된 시간에 실행하는 postAtTime 메소드와 지정된 시간만큼 딜레이된 시간후 실행되는 postDelayed 메소드가 있습니다.


Q.Message 객체를 사용하는 방식보다 post 메소드를 호출하는 방식이 좋은 이유가 뭘까요?

A.코드 양을 줄일 수 있다는게 가장 큰 장점인 것 같습니다.


Q.일정 시간 후에 코드가 실행되도록 만들면서 그 때 다시 또 한번 일정 시간 후에 코드가 실행되도록 만들면 어떻게 될까요?

A.Thread를 사용한 while문 안에 Thread.sleep()을 넣으면 앱이 동작하면서 일정 시간마다 원하는 코드를 실행하게 할 수 있을 것 같습니다.



다음 강좌 AsyncTask를 들으려고 했더니 갑자기 progressbar가 나와서 이번 강좌를 기반으로 혼자 progressBar를 구현해보았는데 궁금한 점이 있어 여쭤봅니다. (차례대로 수강하지 않아서 이전 강좌에서 했던 내용인지는 모르는데 혹시 있다면 죄송합니다)


시작 버튼을 누르면 progressBar가 정상적으로 동작하지만 버튼을 여러번 누를 경우 스레드도 여러개 생성되어 번갈아가면서 실행됩니다.


Q. 이 때 생성할 수 있는 스레드 개수는 제한이 없나요? 막 눌러보았는데 정상 실행되긴 합니다.

A. 생성 가능한 스레드 개수는 폰 성능에 따라서 달라질 수 있을 것으로 보이며, 스펙에서 제한을 두지는 않습니다. 


Q. 스레드를 제한된 개수만큼만 생성하는 방법은 무엇인가요? 

A. JAVA 에서는 스레드풀을 이용하시면 스레드 개수를 제한할 수 있습니다. 



반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기