우리라이프

멀티스레드 프로그래밍(Multi Thread Programming)에서 스레드 간의 커뮤니케이션(Communication) 본문

IT/Android

멀티스레드 프로그래밍(Multi Thread Programming)에서 스레드 간의 커뮤니케이션(Communication)

적당히벌고아주잘살자 2018. 3. 11. 22:08
반응형


Android Application을 개발하면서 싱글스레드로 모든 개발을 하는데는 무리가 있다. 

Android는 Main Thread에서 모든 UI를 처리해야하기 때문에, 데이터의 가공이나 복잡한 계산, 통신은 다른 스레드를 생성해서 개발해야한다. 


1. 스레드와 프로세스의 차이점

1) 프로세스 : 운영체제에서 동시에 여러 프로그램을 실행할 수 있는데, 그 때 실행중인 프로그램에 대한 인스턴스를 프로세스라고 한다. 프로세스는 프로그램에 대한 각각의 인스턴스를 의미하므로, 한 프로세스를 공유하는 것은 아니다. 프로세스는 운영체제로부터 주소공간, 파일, 메모리 등을 할당 받는다.

2) 스레드 : 한 프로세스에서 동작하는 여러 실행의 흐름으로 프로세스 네의 주소공간이나 자원 등을 대부분 공유하면서 실행된다. 한 프로세스가 생성되면 기본적으로 하나의 스레드인 메인스레드가 실행된다. 프로세스는 여러개의 스레드를 가질수 있고, 이를 멀티스레드라고 한다.

3) 프로세스와 스레드의 차이점 : 프로세스는 완벽히 독립적이기 때문에 메모리 영역(Code, Data, Heap, Stack)을 다른 프로세스와 공유하지 않는다. 

스레드는 해당 스레드를 위한 스택을 생성할 뿐 그 이외의 Code, Data, Heap 영역을 공유한다.


2. 멀티스레드(Multi Thread)

둘 이상의 실행 흐름이 필요할 때 만들어진다. java.lang.Thread 클래스나 java.lang.Runnable 인터페이스를 사용해서 생성할 수 있다. 

예) class Thread1 extends Thread {

public void run() {

코드 작성

}

} //java.lang.Thread 스레드 클래스 정의

Thread thread = new Thread1(); //스레드 생성 

thread.start(); //스레드 시작


class Thread2 implements Runnable {

public void run() {

코드 작성 

}

} //java.lang.Runnable 인터페이스를 사용하여 클래스 정의

Thread2 threadObj = new Thread2(); //Runnable 객체 생성

Thread thread = new Thread(threadObj); //Runnable 객체를 파라미터로 Thread 객체 생성

thread.start(); //스레드 시작


3. 스레드간의 커뮤니케이션

1) 스레드간의 데이터 교환 

스레드 간의 데이터를 교환하기 위해서는 데이터 교환에 사용하는 공유영역을 두고, 각각의 클래스에서 참조하여 사용하는 방법이 있다. 하지만 공유데이터를 사용하는 부분은 메모리 Conflict로 ANR이 발생할 수 있다. 공유데이터를 사용하는 부분에서 일어나는데, 이를 critical section이라고 한다.

* critical section의 동기화 방법

- 공유 객체에 플래그를 줘서 플래그 체크를 한다. -> 비효율적...

- synchronized 키워드를 붙인다. synchronized 키워드를 붙여서 블록으로 묶은 부분을 동기화 블록(synchronized block) 이라고 한다.

synchronized (공유 객체) { 

critical section 

* synchronized 키워드와 비슷한 방법으로 lock-free 알고리즘이 있다. critical section의 시작부분에 lock을 걸어주고, 끝나는 부분에 free로 해제하면 된다.


2) 스레드간의 신호 전송

다른 스레드에게 신호를 보내는 notify 메소드와 신호를 받기위해 기다리는 wait 메소드가 있으며, 이 두 메소드는 모두 java.lang.Object 클래스에 속한다. 

obj.notify();  //다른 스레드로 신호를 보내는 메소드

obj.wait();  //다른 스레드로부터 신호가 오기를 기다리는 메소드

obj.notifyAll();  //대기하고 있는 모든 스레드로 신호를 보내는 메소드


4. 스레드의 상태

Thread.sleep(밀리세커드 단위의 숫자) 아무일도 하지 않고 주어진 시간이 경과되기만을 기다리는 메소드

Thread.State state = thread.getState(); //thread : 스레드 객체, getState() : 스레드의 현재상태를 리턴하는 메소드

NEW, RUNNABLE, WAITING, TIMED_WATING, BLOCKED, TERMINATED 가 있다.


출처 :

뇌를 자극하는 Java 프로그래밍 / 김윤명 저자 / 한빛미디어 출판사

http://nickjoit.tistory.com/8


반응형
Comments