study record

[안드로이드] Android Thread 안드로이드 스레드 본문

안드로이드

[안드로이드] Android Thread 안드로이드 스레드

asong 2021. 3. 5. 11:15

스레드(Thread):

  • 프로세스 내에서 순차적으로 실행되는 실행흐름의 최소 단위
  • 프로세스 내에서 실행되는 각각의 독립적인 실행 흐름

멀티스레드 프로그래밍:

하나의 프로세스 내에서 두 개 이상의 스레드가 동작하도록 프로그래밍하는 것

 

메인 스레드:

프로세스가 시작될 때 최초의 실행 시작점이 되는 main()함수로부터 순차적으로 진행되는 하나의 스레드

 

안드로이드 스레드를 만드는 두 가지 방법:

1. Thread 클래스를 상속

Thread 클래스를 상속한 클래스를 만들고 run()메소드를 오버라이드하고, 클래스 객체를 만들어 start()메서드 호출 

    class NewThread extends Thread {
        NewThread() {

        }

        public void run() {
            // TODO : thread running codes.
        }
    }

    NewThread nt = new NewThread() ;
    nt.start() ;

2. Runnable 인터페이스를 구현(implements)

Runnable 인터페이스를 구현하는 클래스를 선언하고 run()메소드를 구현하고, 클래스 인스턴스를 Thread클래스 객체의 생성자에 전달하고, Thread클래스 객체의 start()메소드를 호출한다.

   class NewRunnable implements Runnable {
        NewRunnable() {

        }

        public void run() {
            // TODO : thread running codes.
        }
    }

    NewRunnable nr = new NewRunnable() ;
    Thread t = new Thread(nr) ;
    t.start() ;

 

두 가지 방법의 차이:

  • 단순히 run() 메소드만을 구현하는 경우일 때는 Runnable 인터페이스를 구현
  • Thread클래스가 제공하는 기능을 오버라이드하거나 확장한다면 Thread클래스 상속

 

안드로이드 앱의 시작점:

main()함수를 구현하지 않는 대신, 앱의 액티비티 중 하나를 런처(Launcher)로 지정하여 앱의 시작점으로 만든다.

Manifest 파일의 intent filter에 보면 LAUNCHER가 있다. 그 부분을 해당 액티비티 안으로 넣으면 된다.

안드로이드에 main()함수가 없고 바로 런처로 지정된 액티비티가 실행되는 것이 아니라 개발자가 직접 구현 안 해도 된다는 의미이다.

안드로이드 프레임워크에서 main()함수는 ActivityThread 클래스에 구현되어 있다. 메인 UI Thread를 실행하고, 런처로 지정된 액티비티를 찾아서 실행한다.

 

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

UI프레임워크는 메시지 큐를 사용하여 루프의 코드를 작성한다.

메시지 큐는 시스템 이벤트를 발생 순서대로 전달받아 처리하기 위해 사용되는 구조이다.

메시지가 메시지큐에 수신되면 적절한 핸들러 메소드가 호출된다. 

 

루프(Loop)는 Looper 클래스를 통해 실행되며, 루프 안에서 메시지가 존재하는지 검사한다. 메시지가 도착하면 해당 메시지를 처리할 핸들러 메소드를 실행한다.

Handler 클래스의 핸들러는 메시지 처리를 담당하며 안드로이드에서는 메시지를 보내는 것까지 수행한다.

 

안드로이드 메인 UI 스레드의 중요한 역할인 화면 그리기는 반드시 메인 UI 스레드에서만 실행되어야 한다.

UI를 제대로 표시하기 위해서는 각 요소를 그리는 순서가 절대적으로 중요하므로 하나의 스레드(메인 UI 스레드)에서 순차적으로 그려야 한다.

 

 

 

 

참고 블로그:

recipes4dev.tistory.com/143