관리 메뉴

드럼치는 프로그래머

[안드로이드] 안드로이드의 스레드(Thread) - A. 스레드 본문

★─Programing/☆─Android

[안드로이드] 안드로이드의 스레드(Thread) - A. 스레드

드럼치는한동이 2011. 11. 3. 16:17

스레드(Thread)

 

차례

A.   스레드

B.    핸들러

C.    루퍼

 

A. 스레드

 

 스레드작업을 독립적으로 실행시키는 능력입니다. 여러 독립적인 작업을 동시에 실행하는 것은 멀티 스레드라고 부릅니다. 이런 멀티 스레드를 사용할 때에는 스레드 간의 동기화를 고려해야 합니다. 특히나 안드로이드는 자바 기반으로 만들어졌기 때문에 멀티 스레드를 지원합니다.

 

스레드는 이렇게 독립적으로 실행시키는 능력이라서 조금이라도 복잡해지는 어플리케이션에서 매우 유용하게 쓰입니다. 특히 한 어플리케이션에서 두 가지 작업을 해야 할 때는 필수이죠. 또한 스레드를 이용해서 시간을 체크할 수도 있고 시간 지연을 줘서 타이밍 좋게 여러가지를 다룰 수 있습니다.

 

예로 들면 어떤 작업이 0.5초만 늦춰지면 톱니바퀴가 딱 맞아 떨어질텐데 그렇게 안된다면,

스레드를 이용해 0.5초를 늦출 수 있으니까요.

 

 

스레드의 생성

 

-       디폴트 생성자로 Thread객체 생성

생성된 Thread 객체는 그 자체가 독립적으로 실행되는 흐름이 된다. 스레드는 메인 스레드와 별도의 CPU할당을 받게 되며 스레드를 쓰게 될 경우는 반드시 run 메서드를 작성해야 한다.

 

-       Runnable 인터페이스 구현 객체 생성 후에 Thread의 생성자로 전달

자바는 다중 상속이 되지 않기 때문에 다른 클래스를 상속하고 있을 경우 Runnable 인터페이스를 상속받아서 run 메서드를 작성한다.

 

디폴트 생성자 예제

 

public void onCreate(Bundle savedInstanceState) {

                                   super.onCreate(savedInstanceState);

                                   setContentView(R.layout.thread_threadtest);

 

// XML에서 두 개의 텍스트를 배치 했습니다.

// 그리고 버튼 하나를 배치해서 버튼에 클릭 리스너를 구현했습니다.

// 버튼을 클릭하게 되면 Main 텍스트가 1이 증가하게 한 것입니다.

 

                                   mMainText = (TextView)findViewById(R.id.mainvalue);

                                   mBackText = (TextView)findViewById(R.id.backvalue);

 

                                   Button btn = (Button)findViewById(R.id.increase);

                                   btn.setOnClickListener(new Button.OnClickListener() {

                                                     public void onClick(View v) {

                                                                       mMainValue++;

                                                                       mMainText.setText("MainValue : " + mMainValue);

                                                                       mBackText.setText("BackValue : " + mBackValue);

                                                     }

                                   });

 

// 스레드 객체를 통해서 디폴트 생성자로 생성했습니다.

// setDeamon으로 메인 스레드와 종료 동기화를 이룹니다. 종료 동기화는

// 메인 스레드가 죽게 될 경우, 서브 스레드들도 같이 죽게 하는 것입니다. 안그러면 서브는 메인이 종료되도

// 계속해서 수행하고 있을테니까요.

// 그 이후 start메서드를 이용해서 스레드를 시작 시킨 것이죠.                                

// start를 이용하면 자동으로 run도 실행되게 되어 있습니다.

 

                                   BackThread thread = new BackThread();

                                   thread.setDaemon(true);

                                   thread.start();

                  }

 

              

                  class BackThread extends Thread {

                                   public void run() {

                                                     while (true) {

                                                                       mBackValue++;

                                                                       //mBackText.setText("BackValue : " + mBackValue);

                                                                       try { Thread.sleep(1000); } catch (InterruptedException e) {;}

                                                     }

                                   }

                  }

 

 

Runnable 인터페이스 구현 예제

...

...

// 선언 전의 내용은 같으니 선언만 보도록 할께요.

// 스레드 객체에 인자로 Runnable을 넣어주는게 보입니다.

// setDeamon과 start도 같습니다.

// 스레드를 구현하는 클래스가 Runnable 인터페이스를 구현한다는 것이 다르지요.

// 단, 두 줄의 차이입니다.

 

                                   BackRunnable runnable = new BackRunnable();

                                   Thread thread = new Thread(runnable);

                                   thread.setDaemon(true);

                                   thread.start();

                  }

                 

                  class BackRunnable implements Runnable {

                                   public void run() {

                                                     while (true) {

                                                                       mBackValue++;

                                                                       try { Thread.sleep(1000); } catch (InterruptedException e) {;}

                                                     }

                                   }

                  }


Comments