JAVA

[JAVA] Thread

몽게구름 2025. 7. 16. 15:43

프로세스

-  실행 중인 프로그램의 인스턴스이다.

- 각 프로세스는 독립적인 메모리 공간을 가지며, 운영체제에서 독립된 실행 단위로 취급된다.

 

스레드

-  프로세스 내에서 실행되는 작은 단위

- 여러 스레드는 하나의 프로세스 내에서 자원을 공유

- 프로세스의 코드, 데이터, 시스템 자원등을 공유

- 실제로 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