카테고리 없음

#8 <5주차> 쓰레드

kmsoon 2024. 5. 9. 16:03

프로세스: 운영체제로 부터 자원을 할당받는 작업의 단위 (일)

쓰레드: 프로세스가 할당받은 자원을 이용하는 실행의 단위 (코드실행의 흐름)(일꾼)

 

데몬  쓰레드: 보이지 않는곳(Back ground)에서 실행되는 낮은 우선순위를 가진 쓰레드
보조적인 역할을 담당하며 대표적인 데몬 쓰레드로는 메모리 영역을 정리해주는 가비지 컬렉터가 있다

 

사용자 쓰레드:

보이는 곳(foregorund)에서 실행되는 높은 우선순위를 가진 쓰레드를 말합니다.

프로그램 기능을 담당하며 대표적인 사용자 쓰레드로는 메인 쓰레드가 있습니다.

사용자 쓰레드 만드는 법 : 기존에 만들었던 쓰레드들이 다 사용자 쓰레드입니다.

JVM 은 사용자 쓰레드의 작업이 끝나면 데몬 쓰레드도 자동으로 종료시켜 버립니다.

 

 

 

쓰레드 상태

상태 Enum 설명
객체생성 NEW 쓰레드 객체 생성, 아직 start() 메서드 호출 전의 상태
실행대기 RUNNABLE 실행 상태로 언제든지 갈 수 있는 상태
일시정지 WAITING 다른 쓰레드가 통지(notify) 할 때까지 기다리는 상태
일시정지 TIMED_WAITING 주어진 시간 동안 기다리는 상태
일시정지 BLOCKED 사용하고자 하는 객체의 Lock이 풀릴 때까지 기다리는 상태
종료 TERMINATED 쓰레드의 작업이 종료된 상태

 

wait()

실행 중이던 쓰레드는 해당 객체의 대기실(waiting pool)에서 통지를 기다립니다.

notify()

해당 객체의 대기실(waiting pool)에 있는 모든 쓰레드 중에서 임의의 쓰레드만 통지를 받습니다.

 

 

 

Condition, Lock

synchronized 블럭으로 동기화하면 자동적으로 Lock이 걸리고 풀리지만, 같은 메서드 내에서만 Lock을 걸 수 있다는 제약이 있습니다.

이런 제약을 해결하기 위해 Lock 클래스를 사용합니다.

 

JDK 5에서는 java.util.concurrent.locks 패키지에서 Condition 인터페이스를 제공합니다. Condition은 waiting pool 내의 스레드를 분리하여 특정 조건이 만족될 때만 깨우도록 할 수 있으며, ReentrantLock 클래스와 함께 사용됩니다. 따라서 Condition을 사용하면 wait()과 notify()의 문제점을 보완할 수 있습니다.

 

wait() & notify() 대신 Condition의 await() & signal() 을 사용합니다.

wait()과 notify()는 객체에 대한 모니터링 락(lock)을 이용하여 스레드를 대기시키고 깨웁니다.

그러나 wait()과 notify()는 waiting pool 내에 대기 중인 스레드를 구분하지 못하므로, 특정 조건을 만족하는 스레드만 깨우기가 어렵습니다.

wait() & notify()의 문제점인 waiting pool 내 쓰레드를 구분하지 못한다는 것을 해결한 것이 Condition입니다.