JAVA/about java

[thread] 스레드의 라이프 사이클이란 무엇인가

dev_rosieposie 2023. 9. 5. 20:19

Goal

  1. 스레드의 라이프 사이클에 대해 알아본다

 스레드 라이프 사이클  

스레드 객체 생성 부터 종료까지의 상태이다.

스레드 상태

  1. 스레드는 객체를 생성하고 start()메소드를 호출하면 바로 스레드 실행처럼 보이지만, 실행 대기 상태이다
    • 실행 대기 상태란 아직 스케쥴링이 되지 않아 실행을 기다리고 있는 상태이다.
  2. 실행 대기 상태에 있는 스레드 중에서 스레드 스케쥴링으로 선택된 스레드가 비로서 cpu를 점유하고 run()메소드를 실행한다.
    • 이때를 실행 Running 상태라고 한다.
    • 실행 상태의 스레드는 run()메소드를 모두 실행하기 전에 스레드 스케쥴링에 의해 다시 실행 대기로 돌아갈 수 있다.
    • 그리고 실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 된다.
  3. 이렇게 스레드는 실행 대기 상태와 실행 상태를 번갈아 가며 자신의 run()메소드를 조금씩 실행한다.
  4. 실행 상태에서 run()메소드가 종료되면, 스레드의 실행은 멈추고 종료 상태가 된다.

스레드 스케쥴링 참고

 

[thread] 스레드 우선순위와 동기화를 하는 이유

시작하기 전 ... 해당 포스팅은 이전 포스팅(멀티 스레드와 객체 생성)에 이어집니다 [thread] 멀티 스레드와 작업 스레드 생성 방법 Goal multi thread에 대해 알아본다 작업스레드의 생성과 실행을 해

dev-rosiepoise.tistory.com

일시 정지

  • 경우에 따라, 스레드는 실행 상태에서 실행 대기 상태로 가지 않을 수 있다.
  • 실행 상태에서 일시 정지 상태로 가기도 하는데 일시 정지 상태로 가기도 하는데, 이는 스레드가 실행할 수 없는 상태다
  • 스레드가 다시 실행 상태로 가기 위해서는 일시 정지 상태에서 실행 대기 상태로 가야한다.

 스레드 라이프 사이클 _상태 

상태 열거 상수 설명
객체 생성 NEW 스레드 객체가 생성, 아직 start()메소드가 호출되지 않은 상태
실행 대기 RUNNABLE 실행 상태로 언제든지 갈 수 있는 상태
일시 정지 WAITING 다른 스레드가 통지할 때까지 기다리는 상태
TIMED_WATING 주어진 시간 동안 기다리는 상태
BLOCKED 사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태
종료 TERMINATED 실행을 마친 상태

타겟 스레드 상태 확인

public class StatePrintThread extends Thread{
    private Thread targetThread;

    public StatePrintThread(Thread targetThread) {
        this.targetThread = targetThread;
    }

    public void run() {
        while(true){

            Thread.State state = targetThread.getState();
            System.out.println("타겟 스레드 상태 :"+ state);

            if(state == State.NEW){
                targetThread.start();
            }
            
            if(state == State.TERMINATED){
                break;
            }
            try{
                Thread.sleep(500);
            }catch (Exception e){

            }
        }
    }
}
  • 스레드 상태 얻기
  • 객체 생성 상태일 경우 실행 대기 상태로 만듦
  • 종료 상태일 경우 while 문 종료
  • 0.5초간 실행정지

타겟 스레드

public class TargetThread extends Thread{

    public void run() {
        for(long i=0; i<1000000000; i++){}

        try{
            Thread.sleep(1500);
        }catch (Exception e){

        }
        for(long i=0; i<1000000000; i++){}
    }
}
  • 10억번 루핑 돌게해서 RUNNABLE 상태유지
  • 1.5초간 실행 정지
  • 10억번 루핑 돌게해서 RUNNABLE 상태유지

실행

public class ThreadStateExample {

    public static void main(String[] args){
        StatePrintThread statePrintThread = new StatePrintThread(new TargetThread());
        statePrintThread.start();
    }
}

결과

타겟 스레드 상태 :NEW
타겟 스레드 상태 :RUNNABLE
타겟 스레드 상태 :TIMED_WAITING
타겟 스레드 상태 :TIMED_WAITING
타겟 스레드 상태 :TIMED_WAITING
타겟 스레드 상태 :RUNNABLE
타겟 스레드 상태 :TERMINATED

 

참고하면 좋을 이전 포스팅

 

[Thread safe] Thread safe / unsafe 기준과 코드 설계 방법

Goal Thread safe이란 무엇인지 알아본다 Thread safe vs Thread unsafe Thread safe한 코드 설계하는 방법을 알아본다 Thread safe 여러 개의 스레드에서 동시에 해당 코드를 실행하더라도 문제가 발생하지 않고,

dev-rosiepoise.tistory.com

참고

이것이 자바다 by 신용권