티스토리 뷰

안드로이드

[안드로이드] Thread 예제

머어하지 2017. 4. 20. 14:22

  Thread에 대해서 간단한 예제를 통해 알아보겠습니다. 일단 Thread의 사전적 정으를 보면 다음과 같습니다.

Thread에 대해서 알아봅시다!


  실이란 뜻보다는 2번의 (이야기 등의) 가닥이 더 좋을 것 같네요! 즉, 코드(이야기)를 한 줄 한 줄 실행하는 것이 Thread라 보시면 이해하기 쉽습니다. 일반적으로 코드를 실행하면 Single Thread(단일 스레드)로 실행이 됩니다. 


  일반적으로 Single Thread가 문제가 되지는 않지만 수행하는데 시간이 오래 걸리는 코드들은 문제가 발생되기 시작합니다. 예를 들어 for문을 1억 번 도는 앱이 있으면 이 1억 번 for 문을 돌 동안 for 문 밖의 다른 코드들은 Single Thread로 만들어진 경우는 읽지 못하겠지요? 그렇게 되면 어플은 for 문을 1억 번 돌 동안 열심히 수행을 하고 있지만 사용자 입장에서는 멈춰있는 것처럼 보이게 됩니다.!!!!! 요즘 같은 시대에서는 어플이 답답하면 머여이거 하면서 꺼버리죠... 그렇기 때문에 어플을 만드는 사람들은 복잡한 코드의 경우에는 Single Thread가 아닌 Multi Thread(다중 스레드)로 어플을 만들어 주어야 합니다. 일단 동영상을 통해서 Single Thread의 경우에 멈춤 현상을 알아보겠습니다.


 동영상에서 보이듯 for문에 10억번 도는 것처럼 무거운 작업을 하게 되면은 버튼이 클릭이 안되다가 나중에 파바박!! 되는 것을 보실 수 있습니다. 이러한 것을 해결하기 위해서 Multi Thread(다중 스레드)를 사용하는데요 좀 더 자세히 알아보겠습니다.


예제를 통해 Multi Thread(다중 스레드)를 알아봅시다.

  Multi Thread는 말 그대로 Thread가 여러 개 있는 것입니다. 즉 Thread가 코드를 읽어 실행하는 것이라고 위에서 말씀드렸는데요, 읽는 놈을 여러 개 하겠다는 말입니다. 위의 예제를 예로 들면 for 루프를 도는 것을 다른 Thread가 처리하도록 하면 기존에 있던 Thread는 어플에서 다른 처리를 하면 되겠지요? 이제 코드를 통해 살펴 보겠습니다.


1
Runnable count;
cs


  Runnable을 간단히 보면 코드를 넣어주면 수행시킨다라고 보시면 됩니다. 다음으로 선언한 Runnable을 초기화 시키겠습니다.


1
2
3
4
5
6
7
8
9
10
    count = new Runnable() {
            @Override
            public void run() {
                for(int i=0; i<1000000000;i++){//10억번 반복
                    if(i%100000000==0){//1억번 마다 log 체크
                        Log.d("mylog",""+i);
                    }
                }
            }
        };
cs


  Runnable을 통해서 새로운 Thread가 해야할 일을 만들어 주었습니다. 이제 이 일을 작동 시킬 놈을 만들어 보겠습니다.


1
2
Thread countThread = new Thread(count); // Thread를 생성하고 이 Thread가 작동
                                        // 하면 Runnable인 count를 실행할 것이다.
cs


  새로운 Thread를 만들어 주었습니다. 그리고 앞서 만들었던 count 라는 실행할 Runnable을 인자로 넣어주었습니다. 이제 이 Thread를 작동 시키기만 하면 됩니다!


1
countThread.start(); // 만든 Thread 실행 시작
cs

  Thread를 만들어 시작까지 했습니다. 어떻게 작동을 하는지 동영상으로 확인해 보겠습니다.



  Multi Thread가 잘 동작하기 때문에 아까처럼 버벅이지 않고 작동을 잘 하는것을 보실 수 있습니다. 예제의 코드는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class MainActivity extends AppCompatActivity {
    Button button;
    Runnable count;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        button = (Button) findViewById(R.id.button);
        count = new Runnable() {
            @Override
            public void run() {
                for(int i=0; i<1000000000;i++){
                    if(i%100000000==0){
                        Log.d("mylog",""+i);
                    }
                }
            }
        };
 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Thread countThread = new Thread(count);
                countThread.start();
            }
        });
 
    }
}
cs



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday