운영체제

Thread 생명 주기 개념편

으엉어엉 2024. 11. 29. 12:05
728x90
package thread.control;

import thread.start.HelloRunnable;

import static util.MyLogger.log;

public class ThreadInfoMain {
    public static void main(String[] args) {
        //main 쓰레드
        Thread mainThread = Thread.currentThread();
        log("mainThread = " + mainThread);
        log("mainThread.threadId() = " + mainThread.threadId()); //중복되지 않음. 자동으로 만듬 충돌 X
        log("mainThread = " + mainThread.getName());
        log("mainThread.getPriority() = " + mainThread.getPriority()); //우선순위
        log("mainThread.getThreadGroup() = " + mainThread.getThreadGroup());
        log("mainThread.getState() = " + mainThread.getState());

        // myThread 스레드
        Thread myThread = new Thread(new HelloRunnable(), "myThread");
        log("myThread = " + myThread);
        log("myThread.threadId() = " + myThread.threadId());
        log("myThread.getName() = " + myThread.getName());
        log("myThread.getPriority() = " + myThread.getPriority());
        log("myThread.getThreadGroup() = " + myThread.getThreadGroup());
        log("myThread.getState() = " + myThread.getState());//생성만 하고 실행 안해서.



    }

 

 threadId()  : 스레드의 고유 식별자를 반환하는 메서드이다. 이 ID는 JVM 내에서 각 스레드에 대해 유일하다. ID는 스레드가 생성될 때 할당되며, 직접 지정할 수 없다.

 

 getName() : 스레드의 이름을 반환하는 메서드이다. 생성자에서 ` "myThread"` 라는 이름을 지정했기 때문에, 이 값이 반환된다. 참고로 스레드 ID는 중복되지 않지만, 스레드 이름은 중복될 수 있다.

 

getPriority()  : 스레드의 우선순위를 반환하는 메서드이다. 우선순위는 1 (가장 낮음)에서 10 (가장 높음)까지의 값으로 설정할 수 있으며, 기본값은 5이다. ` setPriority()` 메서드를 사용해서 우선순위를 변경할 수 있다. 우선순위는 스레드 스케줄러가 어떤 스레드를 우선 실행할지 결정하는 데 사용된다. 하지만 실제 실행 순서는 JVM 구현과 운영체제에 따라 달라질 수 있다.

 

getThreadGroup()  : 스레드가 속한 스레드 그룹을 반환하는 메서드이다. 스레드 그룹은 스레드를 그룹화하여 관리할 수 있는 기능을 제공한다. 기본적으로 모든 스레드는 부모 스레드와 동일한 스레드 그룹에 속하게 된다. 스레드 그룹은 여러 스레드를 하나의 그룹으로 묶어서 특정 작업(예: 일괄 종료, 우선순위 설정 등)을 수행할 수 있 다.

부모 스레드(Parent Thread)  : 새로운 스레드를 생성하는 스레드를 의미한다. 스레드는 기본적으로 다른 스레드 에 의해 생성된다. 이러한 생성 관계에서 새로 생성된 스레드는 생성한 스레드를 ** 부모** 로 간주한다. 예를 들어 ` myThread` 는  main스레드에 의해 생성되었으므로  main스레드가 부모 스레드이다.  main스레드는 기본으로 제공되는 main스레드 그룹에 소속되어 있다. 따라서 myThread 도 부모 스레드인 main 스레드의 그룹인 main스레드 그룹에 소속된다.

 

getState()  : 스레드의 현재 상태를 반환하는 메서드이다. 반환되는 값은 Thread.State 열거형에 정의된 상수 중 하나이다. 주요 상태는 다음과 같다.

 

  • New : 스레드가 아직 시작되지 않은 상태
  • Runnable: 스레드가 실행 중이거나 실행될 준비가 된 상태
  • Blocked : 스레드가 동기화 락 기다리는 상태
  • Waiting: 스레드가 다른 스레드의 특정 작업이 완료되기를 기다리는상태
  • Time_Wating: 일정 시간동안 기다리는 상태
  • Terminated: 스레드가 실행을 마친 상태

 

자바에서 스레드의 일시 중지 상태들 이라는 상태는 없다. 스레드가 기다리는 상태들 을 묶어서 쉽게 설명하기 위해 사용한 용어이다.

 

 New (새로운 상태)

  • 스레드가 생성되고 아직 시작되지 않은 상태이다
  • 이 상태에서는 Thread 객체가 생성되지만,  start() 메서드가 호출되지 않은 상태이다.
  • 예시 : Thread thread = new Thread(runnable);

Runnable (실행 가능 상태)

  • 스레드가 실행될 준비가 된 상태. 이 상태에서 스레드는 실제로 CPU에서 실행될 수 있다.
  • start() 메서드가 호출되면 스레드는 이 상태로 들어간다. thread.start();
  • 이 상태는 스레드가 실행될 준비가 되어 있음을 나타내며, 실제로 CPU에서 실행될 수 있는 상태이다. 그러 나 Runnable 상태에 있는 모든 스레드가 동시에 실행되는 것은 아니다. 운영체제의 스케줄러가 각 스레드 에 CPU 시간을 할당하여 실행하기 때문에, Runnable 상태에 있는 스레드는 스케줄러의 실행 대기열에 포 함되어 있다가 차례로 CPU에서 실행된다.
  • 참고로 운영체제 스케줄러의 실행 대기열에 있든, CPU에서 실제 실행되고 있든 모두 Runnable 상태이다. 자바에서 둘을 구분해서 확인할 수는 없다.
  • 보통 실행 상태라고 부른다

Blocked (차단 상태)

  • 스레드가 다른 스레드에 의해 동기화 락을 얻기 위해 기다리는 상태이다.
  • 예를 들어, synchronized 블록에 진입하기 위해 락을 얻어야 하는 경우 이 상태에 들어간다.

 

Waiting (대기 상태) 

  • 스레드가 다른 스레드의 특정 작업이 완료되기를 무기한 기다리는 상태이다
  • wait()  , join() 메서드가 호출될 때 이 상태가 된다.
  • 스레드는 다른 스레드가 notify() notifyAll() 호출 또는 join()이 완료를 기다림.

Timed Waiting (시간 제한 대기 상태)

  • 스레드가 특정 시간 동안 다른 스레드의 작업이 완료되기를 기다리는 상태이다.
  • sleep(long millis) , wait(long timeout), join(long millis) 메서드가 호출될 때 이 상태가 됨
  • 주어진 시간이 경과하거나 다른 스레드가 해당 스레드를 깨우면 이 상태에서 벗어난다.
  • 예시 : Thread.sleep(1000)

Terminated (종료 상태)

  • 스레드가 정상적으로 종료되거나, 예외가 발생하여 종료된 경우 이 상태로 들어간다.
  • 스레드는 한 번 종료되면 다시 시작할 수 없다.

 

자바 스레드의 상태 전이 과정

  1. New → Runnable : start() 메서드를 호출하면 스레드가 Runnable 상태로 전이 된다.
  2. Runnable -> blocked,Waiting, timed waiting: 스레드가 락을 얻지못하거나 wait,sleep 메서드가 호출 할 때 이러한 상태로 전이 된다.
  3.  blocked,Waiting, timed waiting -> Runnable  : 스레드가 락을 얻거나, 기다림이 완료되면 다시 Runnable 상태로 돌아간다.
  4. Runnable -> Terminated : 스레드의 Run() 메서드가 완료되면 스레드는 Terminated 상태가 된다.

 

 

728x90

'운영체제' 카테고리의 다른 글

체크 예외 재정의  (1) 2024.11.29
Thread 생명 주기 - 코드  (0) 2024.11.29
스레드 생성  (0) 2024.11.22
컨텍스트 스위칭  (0) 2024.11.17
Thread - Scheduling,Thread  (0) 2024.11.17