Goal
- 스레드의 라이프 사이클에 대해 알아본다
스레드 라이프 사이클
스레드 객체 생성 부터 종료까지의 상태이다.

- 스레드는 객체를 생성하고 start()메소드를 호출하면 바로 스레드 실행처럼 보이지만, 실행 대기 상태이다
- 실행 대기 상태란 아직 스케쥴링이 되지 않아 실행을 기다리고 있는 상태이다.
- 실행 대기 상태에 있는 스레드 중에서 스레드 스케쥴링으로 선택된 스레드가 비로서 cpu를 점유하고 run()메소드를 실행한다.
- 이때를 실행 Running 상태라고 한다.
- 실행 상태의 스레드는 run()메소드를 모두 실행하기 전에 스레드 스케쥴링에 의해 다시 실행 대기로 돌아갈 수 있다.
- 그리고 실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 된다.
- 이렇게 스레드는 실행 대기 상태와 실행 상태를 번갈아 가며 자신의 run()메소드를 조금씩 실행한다.
- 실행 상태에서 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 신용권
'JAVA > about java' 카테고리의 다른 글
[thread] 스레드의 상태 제어는 어떻게 하는가 (0) | 2023.09.08 |
---|---|
[thread] 스레드 우선순위와 동기화를 하는 이유 (0) | 2023.08.31 |
[thread] 멀티 스레드와 작업 스레드 생성 방법 (0) | 2023.08.31 |
[java] 열거타입 enum (0) | 2023.08.30 |
[java] equals(), hashcode(), toString() 재정의를 왜 하는가 (0) | 2023.08.24 |
Goal
- 스레드의 라이프 사이클에 대해 알아본다
스레드 라이프 사이클
스레드 객체 생성 부터 종료까지의 상태이다.

- 스레드는 객체를 생성하고 start()메소드를 호출하면 바로 스레드 실행처럼 보이지만, 실행 대기 상태이다
- 실행 대기 상태란 아직 스케쥴링이 되지 않아 실행을 기다리고 있는 상태이다.
- 실행 대기 상태에 있는 스레드 중에서 스레드 스케쥴링으로 선택된 스레드가 비로서 cpu를 점유하고 run()메소드를 실행한다.
- 이때를 실행 Running 상태라고 한다.
- 실행 상태의 스레드는 run()메소드를 모두 실행하기 전에 스레드 스케쥴링에 의해 다시 실행 대기로 돌아갈 수 있다.
- 그리고 실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 된다.
- 이렇게 스레드는 실행 대기 상태와 실행 상태를 번갈아 가며 자신의 run()메소드를 조금씩 실행한다.
- 실행 상태에서 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 신용권
'JAVA > about java' 카테고리의 다른 글
[thread] 스레드의 상태 제어는 어떻게 하는가 (0) | 2023.09.08 |
---|---|
[thread] 스레드 우선순위와 동기화를 하는 이유 (0) | 2023.08.31 |
[thread] 멀티 스레드와 작업 스레드 생성 방법 (0) | 2023.08.31 |
[java] 열거타입 enum (0) | 2023.08.30 |
[java] equals(), hashcode(), toString() 재정의를 왜 하는가 (0) | 2023.08.24 |