Thread Life Cycle

상윤·2024년 4월 8일
3

BackEnd

목록 보기
1/11
post-thumbnail

Thread 란?

스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 합니다.

스레드는 자신만의 고유한 스레드 ID, 프로그램 카운터(PC), 레지스터 집합, 스택을 가지고 코드 , 데이터 및 OS 리소스(예 : 열린 파일 및 신호)는 프로세스 내의 다른 스레드와 공유합니다.

스레드마다 고유한 자원(PC, 레지스터 집합, 스택)을 가지고 있는 이유는 독립적인 함수 호출을 가능하게 하여 독립적인 실행 흐름을 추가하기 위해서입니다.

프로세스 vs 스레드 주요 차이점
프로세스와 스레드의 주요 차이점은 동일한 프로세스 내의 스레드는 공유 메모리 공간에서 실행되는 반면 프로세스는 별도의 메모리 공간에서 실행

Life Cycle


new(객체 생성)
Thread 객체가 생성된 상태로 start()메소드 실행전

Runnable(실행 대기)
실행 준비가 완료되었지만 리소스 할당을 기다리는 상태로 스레드의 start() 호출 시 Runnable 상태로 이동

Running(실행상태)
Runnable 상태에서 스레드 스케줄러에 의해 Running 상태로 변경
스케줄러는 Runnable 상태의 스레드 중 하나를 선택해서 실행

Blocked(일시정지)
사용하고자 하는 객체의 lock 이 풀릴 때 까지 기다리는 상태
스레드가 다른 특정한 이유로 Running 상태에서 Blocked 상태로 변경

WAITING(정지)
시간제한 없이 다른 스레드가 특정 작업을 수행하기를 기다리는 중입니다.

Timed_waiting (대기)
다른 스레드가 지정된 기간 동안 특정 작업을 수행하기를 기다리는 상태

Terminated Dead(종료 상태)
run() 메소드 완료시 스레드가 종료, 사용한 쓰레드는 다시 사용할 수 없음

BLOCK
일시정지 상태이며 사용하려는 객체의 모니터 락(monitor lock)이 풀리기를 기다리는 상태이다.
+자바,스프링에서는 스레드를 내부적으로 관리해주면서 스레드 종료까지 시켜주진 않는다.

Thread의 종류


Main Thread
main 메서드도 하나의 스레드를 갖는데 이를 메인 스레드(Main Thread)라고 한다.
메인 스레드는 프로그램이 시작하면 가장 먼저 실행되는 스레드이며 모든 스레드는 메인 스레드로부터 생성된다.
다른 스레드를 생성해서 실행하지 않는다면 메인 스레드가 종료되는 순간 프로그램도 종료된다.하지만, 여러 스레드를 실행하면 메인 스레드가 종료돼도 다른 스레드가 작업을 마칠 때까지 프로그램이 종료되지 않는다.
스레드는 '사용자 스레드(User Thread)'와 '데몬 스레드(Daemon Thread)'로 구분되는데,실행 중인 사용자 스레드가 하나도 없을 때 프로그램이 종료된다.

Daemon Thread
다른 일반 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드이다.
단, 해당 스레드가 시작( start() )되기 전 setDeamon(true)로 데몬 스레드 지정을 해야 한다.

Thread의 작동 순서

Dispatcher Tread
다중 스레드 환경애소 작업을 관리하고 스케줄링하기 위한 중앙제어 쓰레드
쓰레드 풀 큐 작업 메커니즘을 사용, 작업 스레드에 할당
대표로 GC 가 있음

working Thread
할당된 작업을 실행하는 스레드
작업을 수행하고 결과를 생성
워킹스레드는 병렬로 실행되어 효율을 높힐 수 있음

Tread group

논리적으로 스레드를 그룹화하고, 관리하기 위한 메커니즘 제공
속성 및 설정을 한꺼번에 변경하거나 스레드를 계층구조(tree)로 구성 할 수 있음
스레드의 라이프사이클 관리 , 예외처리 및 스레드 모니터링에 사용

예제

Runnable 인터페이스를 구현 or Thread 클래스를 상속받는 방법
작업하고 싶은 내용을 run() 메소드에 작성

class TestThread extends Thread {
   ...
   public void run() {
   	// run() 메소드 오버라이딩
       ...
   }
}

스레드 객체 생성

TestThread thread = new TestThread();

스레드 시작 - start() 메소드 호출

thread.start();

Runnable 인터페이스로 스레드 생성

 class TestRunnable implements Runnable {
	...
    public void run() {
    	// run() 메소드 구현
        ...
    }
}

스레드 객체 생성

Thread thread = new Thread(new TestRunnable());

스레드 시작

thread.start();

Thread 클래스 상속과 Runnable 인터페이스 구현의 차이
자바는 다중 상속을 지원하지 않는다. 그렇기 때문에 Thread 클래스를 상속받는 경우, 다른 클래스를 상속받을 수 없다. 그렇기 때문에 Runnable 인터페이스를 구현하는 것이 일반적이다.

2개의 댓글

comment-user-thumbnail
2024년 4월 9일

잘 보고 갑니다 감사합니다~!!

1개의 답글