이 글은 PC 버전 TISTORY에 최적화 되어있습니다.
서론
자바를 배웠다면 스레드라는 단어는 익숙할 것이다. 필자가 스레드를 처음 배울 때 읽었던 글을 인용해 쉽게 풀어보도록 하겠다. 밥 먹을 때 취사 버튼 누르고 밥 다 되는 동안 식탁을 차리는 것과 유사하다. 국을 끓인다던가, 계란말이를 한다던가, 보통 압력밥솥의 취사버튼을 누르고 아무 것도 하지 않다가 완료 후 식사를 준비하지는 않는다. 이처럼 무언가를 백그라운드로 돌려놓고 다른 여러가지 일을 하는 것이 스레드라고 할 수 있다.
Thread 의 필요성
외부 Thread 가 없이 Main Thread 만으로만 구현하게 된다면, 이러한 문제가 생긴다. 어떠한 버튼을 눌렀을 때 Main Thread 내부적으로 10초 이상이 걸리는 작업을 한다고 치면, 사용자는 그 일이 끝날 때까지 멈춰있는 화면만 보고 있어햐 한다. 그렇기 때문에 개발자는 오래 걸리는 작업들을 외부 Thread를 통해 백그라운드 처리하지 않으면 ANR(Android Not Responding)을 보게 될 것이다.
Thread 사용법
1.) 작업이 끝난 후 UI 변경이 필요 없는 경우를 위한 사용법
new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub firstWork(getApplicationContext()); } }).start();
2.) 기본적인 방법
- Thread 클래스를 상속 받는 하위 스레드 클래스 생성
- 하위 스레드 내에 run( )을 오버라이드 한다. run( )은 Thread가 실행되면 수행되는 곳이다.
- Thread 객체를 생성해주고 start( ) 메소드로 Tread의 run( ) 메소드를 실행시켜준다.
public class ThreadTest extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ExampleThread thread = new ExampleThread(); thread.start(); } private class ExampleThread extends Thread { private static final String TAG = "ExampleThread"; public ExampleThread() { // 초기화 작업 } public void run() { // 스레드에게 수행시킬 동작들 구현 } } }
Thread 사용 예제1 - Timer
private class ExampleThread extends Thread { private static final String TAG = "ExampleThread"; public ExampleThread() { // 초기화 작업 } public void run() { int second = 0; while (true) { second++; try { // 스레드에게 수행시킬 동작들 구현 Thread.sleep(1000); // 1초간 Thread를 잠재운다 } catch (InterruptedException e) { e.printStackTrace(); ; } Log.i("경과된 시간 : ", Integer.toString(second)); } } }
간단한 타이머 구현이니 이해가 어렵다면 차근차근 읽어보길 권장한다.
Thread 사용 예제2 - Join( ) 사용
public class MainActivity extends AppCompatActivity { ExampleThread thread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("메인 스레드 시작"," "); for(int i = 0; i <=3 ; i++) { thread = new ExampleThread(i); thread.start(); } try{ thread.join(); }catch (InterruptedException e) { } Log.i("메인 스레드 종료"," "); } private class ExampleThread extends Thread { private int threadNum = 0; public ExampleThread(int threadNum) { // 초기화 작업 this.threadNum = threadNum; } public void run() { Log.i("시작된 스레드", Integer.toString(threadNum)); try { // 스레드에게 수행시킬 동작들 구현 Thread.sleep(1000); // 1초간 Thread를 잠재운다 } catch (InterruptedException e) { e.printStackTrace(); } Log.i("종료된 스레드", Integer.toString(threadNum)); } } }
위의 예제는 3개의 스레드를 돌리고 난 후 무언가를 실행하는 Join( ) 예제이다. Join( ) 메소드를 사용하면 실행한 스레드의 종료를 알 수 있어 다양한 곳에 사용할 수 있다.
아래는 실행 결과이다.
Join( )을 사용하지 않으면 보시다시피 MainThread의 작업 따로 Thread에서의 작업 따로 진행이 된다.
Joiin( )을 사용하면 보시다시피 Main에서 Thread를 기다리게 된다.
지금까지 안드로이드에서 쓰이는 Thread에 대해서 간단히 알아보았다. 하지만 이 지식만으로는 UI의 변경이라는 큰 벽을 해결할 수 없기 때문에 다음 포스팅에서 Handler와 Looper에 대해서 알아보도록 하겠다.
반응형
'Frontend > Android' 카테고리의 다른 글
[안드로이드] AsyncTask란? (개념 및 사용법) (3) | 2016.07.07 |
---|---|
[안드로이드] runOnUiThread란? (개념과 사용법) (5) | 2016.07.07 |
[안드로이드] Thread, Handler, Looper를 통한 백그라운드 처리 (10) | 2016.07.06 |
[안드로이드] ANR의 의미와 예방 (2) | 2016.07.05 |
[안드로이드] 리스트뷰 성능최적화 (Convertview와 ViewHolder Pattern의 이해) (2) | 2016.07.05 |
[안드로이드] 리스트뷰의 개념 및 사용법 (1) | 2016.07.05 |