자바
[JAVA] 스레드 생성 방식과 생명주기
planting grass
2025. 4. 17. 12:15
728x90
들어가기 앞서
스레드와 멀티스레드에 대해 잘 모른다면 아래글을 참고하면 된다.
https://lold2424.tistory.com/236
[JAVA] 멀티스레드란?
스레드란?스레드(Thread)는 하나의 프로세스 내에서 실행되는 작업의 흐름이다.자바 프로그램은 기본적으로 main() 메서드 안에서 실행되는 단일 스레드 환경이다.하지만, 동시에 여러 작업을 처리
lold2424.tistory.com
스레드 생성 방식
1. Thread
클래스 상속
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread 상속 방식 실행 중...");
}
}
public class Main {
public static void main(String[] args) {
MyThread t1 = new MyThread();
t1.start(); // run()이 아닌 start() 호출!
}
}
- 장점: 간단하고 직관적
- 단점: 이미 다른 클래스를 상속 중이라면 다중 상속이 불가능 → 확장성 떨어짐
2. Runnable
인터페이스 구현
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable 구현 방식 실행 중...");
}
}
public class Main {
public static void main(String[] args) {
Thread t2 = new Thread(new MyRunnable());
t2.start();
}
}
- 장점: 다른 클래스를 상속하면서도 스레드 기능 구현 가능
- 코드의 분리도 좋고 구조화에 유리
주의할 점
run()
을 직접 호출하면 일반 메서드처럼 동작함 → 반드시 start()
로 실행할 것
하나의 스레드 인스턴스는 단 1번만 start()
호출 가능
스레드 생명주기
스레드는 생성부터 종료까지 아래와 같은 상태를 가진다.
NEW → RUNNABLE → RUNNING → (WAITING/BLOCKED/TIMED_WAITING) → TERMINATED
상태 | 설명 |
NEW | Thread 객체가 생성되었지만 start()를 호출하지 않은 상태 |
RUNNABLE | start()를 호출했지만, 실제 CPU 스케줄러에 의해 실행되기 전 대기 상태 |
RUNNING | CPU가 해당 스레드를 선택해 실행 중인 상태 |
WAITING/BLOCKED/TIMED_WAITING | sleep(), join(), wait() 등에 의해 일시 중지된 상태 |
TERMINATED | run() 메서드가 종료되거나 예외로 인해 실행이 끝난 상태 |
생명주기 관련 메서드
메서드 | 설명 |
start() | 스레드를 시작하고 RUNNABLE 상태로 전환 |
run() | 스레드가 실행할 작업 정의 (직접 호출 X) |
sleep(ms) | 일정 시간 동안 스레드 일시 중지 |
join() | 다른 스레드의 작업이 끝날 때까지 기다림 |
두 스레드를 동시에 실행하는 예시
public class MyThreadTest {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 3; i++) {
System.out.println("t1 실행 중");
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 3; i++) {
System.out.println("t2 실행 중");
}
});
t1.start();
t2.start();
}
}
동시에 실행되기 때문에 결과는 매번 다르게 나온다.
728x90