SW 배움터/안드로이드

안드로이드1 : 스레드 I

kusson 2017. 4. 10. 10:33
반응형
728x170

스레드란 무엇인가?

 

 

1. 프로세스: 스레드의 개념을 이해하기 위해서는 먼저 프로세스란 개념을 알아야 하는데

 그 이유는 스레드가 프로세스 기능중의 일부분이기 때문입니다.

 컴퓨터는 명령을 실행할 프로그램을 메모리에 적재(Load) 시켜놓고, CPU가 명령어를 하나씩

해석하면서 명령의 순서대로 프로그램을 처리합니다. 이때 하드디스크나 USB 같은 보조 기억 장치에 저장되어 있는 프로그램을  메모리에 적재(Load)하게 됩니다. 하드디스크나 USB에있는 프로그램을 파일이라고 부르고 메모리에 적재된 프로그램을 프로세스(Process)라고 합니다. 프로세스에 대한 이해를 돕기 위해 간단한 그림을 준비했습니다. 

     

 

 위의 그림에서 보듯이 프로세서(Processor)는 우리가 일반적으로 알고있는 CPU안의 메모리 부분이고 프로세스(Process)는 메모리에 적재되어 있는 자원 할당 기능과 프로그램이라고 이해하면 된다. 간단히 정리하면

 ① 프로세스(Process)는 메모리에 적재되어 있는 프로그램.

 ② 프로세스(Process) = 자원 할당과 관련된 기능 + 처리해야 될 명령(스레드).

결국 프로세스는 자원 할당과 관련된 기능과 처리해야 될 명령으로 구성되어 있습니다. 이러한 두 가지 종류의 작업 중에서 명령과 관련된 부분만을 스레드라고 합니다. 즉, 한개의 프로세스에서 독립적으로 처리하는 작은 작업 단위를 스레드(Thread)라고 부릅니다.

 

2. 스레드: 스레드란 여러가지 작업을 동시에 처리할 수 있도록 해 주는 것 즉 프로세스안에서 순차적으로 작동하는 명령어의 집합 또는 각각의 작업을 의미합니다. 명령어들은 하나의 실로 꿸 수 있기 때문에 스레드(Threrad: 실)라고 부릅니다.

 

3. 스레드 사용법(자바는 다중 상속이 안되므로 스레드를 이용해야 한다).

 1) 스레드를 상속받아서 사용하는 방법(상속 받은것이 없이 스레드를 사용할 때)

   ex) class ThreadTest extends Thread{

       ................

        public void run(){                         // run() 메소드를 재정의.

            .........................}

       }

 

 2) Runnable 인터페이스를 implements하는 경우(어떤 class를 이미 상속 받은 경우)

  ex) class ThreadTest extends 슈퍼클래스 implements Runnable {       //run() 메소드 재정의.

         ........................................ }

       2)의 경우에는 Runnable 인터페이스로 구현한 클래스의 객체를 인수로 주어 스레드

        클래스의 객체를 생성한 후, 생성된 스레드 객체의 start() 메소드를 호출해야 한다.

 

4. 스레드의 동기화(Synchronization)

 여러개의 스레드가 동시에 실행되어 하나의 같은 자원을 사용하려 할때, 어느 한 시점에서는 하나의 스레드만 사용하도록 하는 것.

  ex) sychronized void 메소드명령( ) {

      ................................................... }

 

5. 메인 스레드

 애프리케이션이 구동되면 시스템은 애플리케이션을 위한 실행스레드를 생성하는데

 이 스레드를 메인 스레드라 한다(메인 스레드 = UI).

 1) 메인 스레드의 역할

   ① 사용자 이터페이스 위젯에게 이벤트를 전달 함.

   ② 화면을 그리는 작업 함.

 2) 스레드 사용 원칙.

   ① UI 스레드는 블럭(멈춤) 시키면 안된다.

   ② UI 스레드가 아닌 다른 스레드가 UI 툴킷을 조작하면 안된다.

 3) 스레드에서 UI를 조작하는 방법

   ① View.post(Runnable)을 이용하는 방법.

       ex) mImageView.post(new Runnable() {         

            public void run()

              ........................

            }

          

   ② Handler 클래스를 사용하는 방법(메시지 객체 전송)

      : Handler는 하나의 스레드에서 다른 스레드로 메시지 객체와 러너블(Runnable) 객체를

       보내고 처리하는 데 사용하는 클래스이다.

       ex) class WorkerThread extends Thread {

             handler handler;

 

              WorkerThread(Handler handler){

                this.handler = handler;

           }

             .................

          }

          

   ③ AsyncTask 사용하기

      AsyncTask는 작업 스레드와 관련된 복잡한 부분을 쉽게 처리해 주는 클래스이다.

      AsyncTask는 개발자로 하여금 사용자 인터페이스에 대한 비동기적인 작업을 허용한다.

     하나의 클래스안에 백그라운드 작업과 그 작업의 결과를 UI 객체에 반영하는 코드를 같이 

     구현할 수 있으므로, 스레드로 수행해야 할 어떤 기능을 하나의 클래스만으로 만들 수 있는

     장점이 있다.

       ㉮방법 1

                공유 데이터에 접근하는 메소드를 synchronized 키워드로 처리.

                 ex) synchronized method( ) {

                              공유 데이터에 접근

                               ...................

                     }

       

        ㉯방법2

                 공유 데이터에 접근하는 영역을 synchronized 키워드로 블록화 처리.

                 이때 공유 자원을 갖고 있는 클래스의 객체를 사용함.

                 ex) synchronized (사용할 객체) {

                         ........처리할 블록........

                     }

 

   ④ AsyncTask를 이용한 작업 수행 방식.

 

              메인 스레드                                         신규 스레드

                                               execute

           onPreExcute()                     

           onProgressUpdate()                     doInBackground()

           onPostExecute()

 

 

 

   

 

반응형
그리드형