반응형
개요
- 김영한 강사님의 강의를 듣고 정리하였다.
본론
스레드의 상태
- Thread의 getState() 메서드를 사용하면 해당 스레드의 현재 상태를 확인할 수 있다.
- 이 상태들은 Thread.State 열거형에 정의되어 있다.
NEW
public static void main(String[] args){
Thread thread = new Thread();
thread.getState();
}
- 스레드 객체가 새로 생성되었지만 아직 start() 메서드를 통해 스레드가 만들어지지 않은 상태이다.
RUNNABLE
public static void main(String[] args){
Thread thread = new Thread();
thread.start();
thread.getState();
}
- 스레드가 실행될 준비가 된 상태이며, 이 상태에는 스레드는 CPU를 할당받아 작업을 수행할 수 있다.
- 이 상태의 이름이 RUNNABLE인 이유는 실제로 해당 상태더라도 CPU를 할당받지 못해 코드를 실행하지 못할 수 있으며 OS의 스케줄러에 의해 실행된다. 따라서 자바는 이를 구분해주지 않는다.
BLOCKED
- 스레드가 다른 스레드가 가지고 있는 동기화 락을 얻기 위해 기다리고있는 상태이다.
- synchronized 블록에 진입하기 위해 락을 얻어야 하는 경우 이 상태로 들어가게 된다.
WAITING
- 스레드가 다른 스레드의 특정 작업이 완료되기를 무기한 기다리는 상태이다.
- join(), wait() 메서드를 호출하면 스레드는 해당 상태가 된다.
TIMED_WAITING
- 스레드가 특정 시간 동안 작업을 기다리고 있는 상태이다.
- WAITING과 다른 점은 무기한 기다리는 것이 아닌 정해진 시간만큼만 기다린다는 것이다.
TERMINATED
- 스레드가 할당된 작업을 모두 수행한 상태이다.
- 스레드의 스택에 스택프레임이 존재하지 않으면 해당 상태가 된다. (run() 메서드 종료)
상태의 흐름
public class ThreadStateMain{
public static void main(String[] args){
Thread thread = new Thread(new MyRunnable, "myThread");
thread.getState(); // NEW ... 1
thread.start();
Thread.sleep(1000);
thread.getState(); // Timed Waiting ... 3
thread.join();
Thread.currentThread().getState(); // waiting ... 4
Thread.sleep(5000);
thread.getState(); // TERMINATED ... 5
}
static class MyRunnable implements Runnable{
@Override
public void run(){
// 작업
Thread thread = Thread.currentThread();
thread.getState(); // RUNNABLE ... 2
Thread.sleep(5000);
}
}
}
- 새로운 thread 객체를 생성하고 이 상태를 확인하면 NEW 상태이다.
- thread 객체의 start() 메서드를 호출하면 새로운 스택과 해당 스택에 run() 메서드가 실행되면서 getState()가 호출된다. 이때 상태는 RUNNABLE이다.
- 그런다음 thread는 5초동안 쉬게되는데, 이때 상태를 찍어보면 TIMED_WAITING 상태가 된다.
- 그 후 main 스레드는 새로 만든 thread를 join을 통해 종료될때까지 기다리는데 이때, 시간 제약없이 기다리기 때문에 main 스레드는 WAITING 상태로 들어간다.
- 마지막으로 5초가 지난 후, thread는 종료되기 때문에 상태는 TERMINATED가 된다.
결론
스레드의 여러 상태들에 대해서 알아보았다.
이 상태들은 OS의 스케줄링을 받을 수 있는 상태인 RUNNABLE, 새로 만들어지고 종료되었을 때의 NEW, TERMINATED, 스케줄링 받지 않고 휴식 상태인 WAITING, TIMED WAITING, BLOCKED로 나뉜다.
반응형
'JAVA' 카테고리의 다른 글
[JAVA] 스레드의 양보 Thread.yield() (0) | 2024.09.21 |
---|---|
[JAVA] 대기중인 스레드를 RUNNABLE로 깨우려면 어떻게 해야할까? (0) | 2024.09.21 |
[JAVA] 자바에서 스레드를 만들고 사용하는 방법 (1) | 2024.08.30 |
[JAVA] JVM, 자바의 메모리 구조 (0) | 2024.08.30 |
DES 알고리즘을 이용한 파일 암복호화 (0) | 2023.10.02 |