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 (종료 상태)
- 스레드가 정상적으로 종료되거나, 예외가 발생하여 종료된 경우 이 상태로 들어간다.
- 스레드는 한 번 종료되면 다시 시작할 수 없다.
자바 스레드의 상태 전이 과정
- New → Runnable : start() 메서드를 호출하면 스레드가 Runnable 상태로 전이 된다.
- Runnable -> blocked,Waiting, timed waiting: 스레드가 락을 얻지못하거나 wait,sleep 메서드가 호출 할 때 이러한 상태로 전이 된다.
- blocked,Waiting, timed waiting -> Runnable : 스레드가 락을 얻거나, 기다림이 완료되면 다시 Runnable 상태로 돌아간다.
- Runnable -> Terminated : 스레드의 Run() 메서드가 완료되면 스레드는 Terminated 상태가 된다.
'운영체제' 카테고리의 다른 글
체크 예외 재정의 (1) | 2024.11.29 |
---|---|
Thread 생명 주기 - 코드 (0) | 2024.11.29 |
스레드 생성 (0) | 2024.11.22 |
컨텍스트 스위칭 (0) | 2024.11.17 |
Thread - Scheduling,Thread (0) | 2024.11.17 |