Development/Android

23. Multi Thread -1

궁선이 2018. 5. 5. 01:49

먼저 프로세스와 쓰레드의 개념에 대해서 설명하겠습니다.

프로세스란?
강으로 비유하자면 하나의 큰 흐름이자 명칭입니다.
한강에는 수많은 지류들이 있습니다.
그러나 우리는 이 모든걸 통틀어서 한강이라고 합니다.
물론 지류가 없이 큰 줄기하나의 강이 존재할 수 도 있습니다.
 이런한 형태들의 프로그램 흐름을 프로세스라 합니다.

시스템적으로 설명하자면 디스크에 저장되어있는 '프로그램'이
메인메모리에 공간을 할당받고 CPU에 의해 실행된 상태를 프로세스라고 합니다.

요약하자면 프로세스는 프로그램의 커다란 흐름입니다.
(하나의 프로그램이 여러 프로세스로 이루어질 수 있지만 이는 혼란을 초래하므로 넘어가겠습니다.)

쓰레드란?
쓰레드란 위에서 말한 여러가지 흐름입니다.
그것이 하나가 될 수도있고 여러가지가 될 수도 있습니다.
강의 물길도 하나가 있을 수 있고 여러가지가 있을 수 있습니다.
한강에는 북한강,남한강 그리고 그 외의 여러 작은 지류들이 있습니다.
이러한 흐름들의 명칭을 쓰레드라고 합니다.

프로그램적인 설명을 덧 붙이자면
프로세스 내에서 실행되는 흐름의 단위

 프로세스와 쓰레드의 차이점과 특징은 위에 서술한 것들이 전부는 아닙니다.
더 자세한 정보는 위키를 찾아보시기 바랍니다.


그렇다면 안드로이드에서의 쓰레드는 어떤식일까요?

안드로이드에서는 앱이 실행될 때 기본적으로 하나의 프로세스가 생성됩니다.
그리고 그에 따라 하나의  Main Thread가 생성 됩니다.
이 때 Main Thread는 UI Thread의 역할도 합니다.
무슨 말이냐면 UI의 글자나 형태등의 변경에 관한 UI작업은
Main Thread에서만 해야합니다.

그리고 Main Thread의 작업시간이 길어지면 OS에서 앱이 종료되었다고 판단하여
사용자에게 앱을 종료할 것인지 물어보는 대화상자를 띄워줍니다.
그래서 작업시간이 오래걸리거나 Network작업들은 Sub Thread를 생성하여 작업해줍니다.

기본적인 Thread 생성 방법들
1. Thread Class로 상속하기
class MyThread extends Thread{ @Override public void run(){ super.run(); //이곳에 구현 } } //사용 방법 MyThread th = new MyThread(); th.start;
2. Runnable Interface로 구현하기
class MyRun implements Runnable{ @override public void run(){ //이곳에 구현 } } //사용방법 Thread th = new Thread(new MyRun()); th.start;
Handler 사용하기

UI변경을 Main Thread에서만 가능하다고 했었습니다.
subThread에서 UI를 변경해야 할 필요가 있을 때,  
Main Thread의 핸들러를 이용하여 UI를 업데이트하여줍니다.

핸들러는 Message Queue에 Message를 넣기 위한 클래스입니다.
핸들러는 subThread 들로부터 받은 메세지들을 
Main Thread의 Looper(Message Queue)에 넣습니다.
그리고 Maint Thread는 Looper로부터 데이터를 읽어와 UI에 적용시킵니다.

핸들러는 스레드 간에 메세지 객체나 Runnable 객체를 통해 통신할 수 있습니다.

출처 : 한양대학교 장소연 교수님
1. 핸들러 생성 방법
int count = 0; //1. 핸들러 객체를 생성 Handler handler = new Handler(); public void example(){ for(int i =0; i<10;i++){ //2. message 객체를 리턴받아 메세지 작성 Message msg = handler.obtainMessaage(); Thread.sleep(1000); count++; //3.message를 보냄; handler.sendMessage(msg); } } //4. 메세지를 전달된 정보를 이용해서 UI업데이트 Handler handler2 = new Handler(){ @override public void handleMessage(Message msg){ tv.setText(count + "번"); } };
2. 핸들러 응용(3초후 액티비티 전환)
public class StartActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_start); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(StartActivity.this,MainActivity.class); startActivity(intent); finish(); } },3000); } }

안드로이드 레퍼런스입니다.
핸들러의 각종 함수들이 있습니다. 읽어보시기 바랍니다.
레퍼런스 읽는 습관을 들이시고 영어문서 읽는 것이 익숙해져야 합니다.
저도 아직도 힘들지만
그것이 컴공의 숙명인 것 같습니다.ㅜㅜ

쓰레드 포스팅 1은 여기서 마치고 2에서 AsyncTask를 포스팅하겠습니다.