프로세스
- 실행 중인 프로그램의 인스턴스이다.
- 각 프로세스는 독립적인 메모리 공간을 가지며, 운영체제에서 독립된 실행 단위로 취급된다.
스레드
- 프로세스 내에서 실행되는 작은 단위
- 여러 스레드는 하나의 프로세스 내에서 자원을 공유
- 프로세스의 코드, 데이터, 시스템 자원등을 공유
- 실제로 CPU에 의해 실행되는 단위는 스레드
| start() | 새로운 스레드를 생성해서 run() 실행 | 비동기 실행 | ✅ 새로운 스레드 생성 |
| run() | 일반 메서드처럼 호출 | 동기 실행 (main 스레드에서 실행) | ❌ 새로운 스레드 X |
- start()는 내부적으로 native 메서드를 통해 운영체제 수준에서 새로운 스레드를 생성
- 이후 run()을 자동으로 호출함
사용자 스레드
- 프로그램의 주요 작업 수행
- 작업이 완료될 때까지 실행
- 모든 사용자 스레드가 종료되면 JVM도 종료
데몬 스레드
- 백그라운드에서 보조적인 작업 수행
- 모든 사용자 스레드가 종료되면 데몬 스레드는 자동으로 종료
Thread 상속 vs Runnable 구현
스레드를 사용할 때는 Thread를 상속 받는 것 보다 Runnable 인터페이스를 구현하는 방식을 사용하는 것이 좋다.
Thread 상속 방식
장점
- 간단한 구현 : Thread 클래스를 상속받아 run() 메서드만 재정의
단점
- 상속의 제한 : 자바는 단일 상속만 허용하기 때문에 다른 클래스를 상속 받거나
상속 받아야 할 경우 Thread 클래스를 상속 받을 수 없다.
public class MyThread extends Thread {
public void run() {
System.out.println("작업 실행: " + Thread.currentThread().getName());
}
}
// 실행
MyThread t = new MyThread();
t.start();
Runnable 인터페이스 구현 방식
장점
- 상속의 자유로움 : 인터페이스로 구현 하기 때문에 다른 클래스를 상속 받을수 있다.
- 코드의 분리 : 코드의 가독성이 높아진다.
단점
- 코드가 복잡해 질 수있다.
public class MyTask implements Runnable {
public void run() {
System.out.println("작업 실행: " + Thread.currentThread().getName());
}
}
// 실행
Runnable task = new MyTask();
Thread thread = new Thread(task);
thread.start();
스레드의 생명 주기
상태 설명
| NEW | 스레드 객체 생성됨 (new Thread()) 아직 start() 호출 안 됨 |
| RUNNABLE | start() 호출됨 → JVM이 스레드 실행 예약 |
| RUNNING | CPU가 이 스레드를 할당해서 run() 실행 중 |
| BLOCKED | 다른 락을 점유한 스레드가 있어서 대기 중 |
| WAITING | 다른 스레드의 알림을 기다림 (wait(), join() 등) |
| TIMED_WAITING | 일정 시간 동안만 기다림 (sleep(), join(timeout), wait(timeout)) |
| TERMINATED | run() 메서드가 끝나거나 예외 발생 시 종료됨 |
'JAVA' 카테고리의 다른 글
| [JAVA] HashMap (0) | 2025.07.16 |
|---|---|
| [JAVA] Hash (1) | 2025.07.16 |
| [JAVA] List vs Set (1) | 2025.07.16 |
| [JAVA] ArrayList 란? (1) | 2025.07.16 |
| 변수 범위 (0) | 2025.07.15 |