728x90

Thread

할당된 메모리 공간을 기반으로 실행중인 프로그램을 프로세스라고 한다. 즉 간단히 실행중인 프로그램이라고도 한다.

이 프로세스는 프로그램의 흐름이 있는데, 하나의 프로세스에서 둘 이상의 프로그램 흐름을 형성할 수 있다. 

이 프로그램 흐름을 쓰레드라고 한다. 즉 쓰레드는 프로세스 내에서 프로그램의 흐름을 형성하는 주체로,  실제 프로그램이 수행되는 최소 단위이다.

하나의 프로세스는 최소한 한 개 이상의 쓰레드를 갖는다.

 

구현

쓰레드 구현은 extends Thread을 이용해, 즉 상속으로 구현하는 방법이 있다.

이미 다른 클래스를 상속하는 경우,  implements Runnable 즉 Runnable 인터페이스를 이용하는 방법이 있다.

 

멀티쓰레드 프로그래밍

동시에 여러 쓰레드가 실행되는 프로그래밍

각각의 쓰레드는 Context라 불리는 작업공간을 가진다.

공유 지원이 있는 경우 race condition이 발생한다.

critical section에 대한 Synchronization 동기화 구현이 필요하다.

 

쓰레드 우선순위

쓰레드는 1부터 10까지의 우선순위를 갖는다.

기본 우선순위는 5이며 높은 우선순위를 설정할수록 먼저 실행될 확률이 높아진다.

setPriority(1); 처럼 쓰레드를 상속받은 클래스 내의 생성자에서 실행한다.

 

운영체제 별로 지원하는 우선순위가 다를 수 있다.

따라서 우선순위를 상수로 정의되어 있는 MAX_PRIORITY, NORM_PRIORITY, MIN_PRIORITY로 설정하는 것이 운영체제에 따른 차이를 최소화할 수 있다.

 

쓰레드 상태

쓰레드는 생성, Runnable , Run , Not Runnable(Blocked), Dead 의 상태가 있다.

 

Runnable에서 블락이 되는 경우는 sleep()을 통해 일정 시간동안 잠들거나

wait(), join()으로 블락되는 경우가 있다.

 

블락에서 다시 Runnable이 되려면 sleep의 시간이 끝나거나, wait()에서 notify()를 호출당하거나, join()을 한 다른 쓰레드가 종료되어야 한다.

쓰레드의 메모리 구성

쓰레드가 생성되면 가상머신은 쓰레드의 실행을 위한 별도의 메모리 공간을 할당한다.

모든 쓰레드는 자신의 스택을 할당 받는다. 그러나 힙과 메소드 영역은 모든 쓰레드가 공유를 한다.

즉 인스턴스의 주소값만 알면 쓰레드가 달라도 같은 인스턴스에 접근이 가능하다.

그림을 보면 이해가 될 것이다.

쓰레드의 메모리 구성

 

join() 메소드

해당 쓰레드가 종료될 때까지 실행하는 메소드

th1.join()을 실행하면 th1 쓰레드가 종료되어야 다음 라인이 실행된다.

DeadLock

둘 이상의 프로세스 또는 쓰레드가 서로 자원을 기다리면서 교착 상태에 빠진 것.

 

 

wait() / notify() 메소드

wait() : 리소스가 더이상 유효하지 않은 경우 사용가능할 때 까지 쓰레드를 Not Runnable 상태로 전환한다.

wait 상태가 된 쓰레드는 notify()가 호출될 때 까지 기다려야한다.

 

notify() : wait()중인 쓰레드 중 한 쓰레드를 Runnable한 상태로 깨운다.

 

notifyAll() : wait()중인 모든 쓰레드를 깨운다. all을 사용하는 게 더 권장된다.

 

Critical Section

두 개 이상의 쓰레드가 동시에 접근하게 되는 리소스

두 쓰레드가 동시에 접근할시 결과를 보장할 수 없으므로 쓰레드간의 순서를 맞추는

동기화가 필요하다.

 

동기화 Synchronization

Critical Section에 여러 쓰레드가 동시 접근한 경우 한 쓰레드를 실행시키고 다른 쓰레드를 lock해서 

접근을 제한한다.

동기화를 잘못 구현하면 deadlock 상태에 빠질 수 있다.

 

동기화 구현

Synchronized 메소드를 이용하는 방법과 

Synchronized 수행문을 이용하는 방법이 있다.

메소드는 현재 메소드가 포함된 객체에 lock을 거는 것이다.

수행문은

synchronized(참조형 수식){

}

을 통해 구현하며 참조형 수식에 해당되는 객체를 lock한다.

 

728x90

+ Recent posts