본문 바로가기
[ Developer ]/Android

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

by 김현섭. 2016. 7. 14.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Java Thread란? 자바 스레드
  • 동시적인 처리를 할 수 있지만 동일한 결과 값을 보장받을 수 없다
  • 교실에서 대청소를 한다.
  • 학생들의 무리는 교실, 화장실, 복도 를 나눠서 청소를 하는데
  • 여기서 각각의 무리들이 나뉘어져서 청소를 동시에하면 thread, 그렇지 않고 하나씩 청소를 한다면 절차지향적이다
    • Task : 하나의 작업 단위
    • Process : 하나의 쓰레드. 하나의 쓰레드가 뜨면 그 쓰레드는 독립적인 자원을 얻는다.
  • 쓰레드가 프로그램과 관계없이 독립적으로 돌아간다.
  • 쓰레드는 메모리가 독립적이다.

  • 병렬 처리 프로그래밍
  • 써야하는 자원은 한정적이고 메모리를 동시에 제어를 해야하므로 어렵다.
  • 말은 병렬이지만 거의 직렬화 시키는 것과 비슷하다
    • 일반적
    • *(시작)----------------------------------------(끝)*
    • 쓰레드(바뀌는 swap되는 것이 짧다)
    • *(시작)----- -------- ------- (끝)*
    • *(시작) -------- ------- -------(끝)*

  • 쓰레드는 쓰기는 쉽지만, 함부러 쓰면 안됩니다!
  • 쓰레드를 사용했을 경우에 아래와 같이 중간에 숫자가 잘 못 나오는 경우가 있는데, 이때 어떤 쓰레드가 했는지 잘 모르기 때문에 오류(버그)찾기가 매우 힘듭니다. 쓰레드에 들어가는 이상 직렬화가 어렵다.



Thread 실습

@ 안좋은 방식
Thread를 실습하기 위해서 Java Project를 하나 생성한다


간단하게 위와 같이 작성되면 numberOne은 어떤 값이 출력될까
20이 출력된다 절차적으로 처리를 하기 때문에 numberOne 10은 numberOne 20을 넣음으로 인해서 값은 사라지게 된다

이제 Thread를 실습해보기 위해서 첫 번째 방식을 이용한다


CounterThread라는 클래스를 생성하고 Thread를 상속받아서 for문을 이용해서 출력을 해본다
위의 방식으로는 0부터 99까지 나오고 그 이후에 0부터 99가 한번 더 나오게 된다
0과 0이 한번에 실행되는 동시에 실행을 하려면 다음처럼 사용하면 된다


메인에서 위와 같이 작성하면 된다
start는 선언하지 않았지만 start를 하면 run을 실행을 시켜준다


결과를 보면 뒤죽박죽인 것을 알 수 있다 하나의 프로세스 단위를 잘라서 동시에 돈 것이다
아예 같이 동작을 하게하려면 다음과 같이 하면 된다


위와 같이 Thread를 수정하면 동시에 나오는 것을 볼 수 있다


위의 원리는 하나의 작업이 잠깐 쉴 때 다른 작업으로 넘겨주기 때문에 두 개가 한번에 실행되는 것이다
실행하는 클래스의 이름을 알기 위해서 CounterThread를 조금 바꿔준다



그런 후 메인에서 이름을 지정해주면 나오게 된다


뒤죽박죽인 것을 알 수 있다 스레드 자체가 돌고싶을 때 돈다 이래서 나중에 데이터가 꼬인다면 찾기가 힘들어지는 것이다
위의 방식은 좋지 않은 방식이므로 사용을 자제한다


@ 좋은 방식

2번 째 방식을 실습하기 위해서 클래스를 우선 생성한다


인터페이스의 구현클래스로 지정하면 run이 생성된다


메인을 가져와서 메인의 카운트를 증가시킨다


이제 메인에서 Main 객체를 생성해서 Thread를 생성할 때 사용한다


위의 결과는 문제없이 숫자가 출력되었다


Android Thread

안드로이드의 스레드도 자바의 스레드와 거의 비슷하다



안드로이드는 handler를 사용하는데 안드로이드의 메인 스레드와 무언가를 하기 위해 새로운 스레드를 생성했을 때
새로운 스레드는 메인 스레드로 접근이 불가능하다 (동시성의 문제) 그래서 접근하기 위해서 handler.post 안에 스레드를 넣어서
메인 스레드로 가는 스레드가 직렬화되게 된다