본문 바로가기
Java

[JAVA] Thread와 Runnable

by teamnova 2025. 3. 9.
728x90

안녕하세요. 

 

오늘은 java에서 멀티스레드를 구현하는 방법 중 Thread와 Runnable 의 차이에 대해 알아보겠습니다. 

 

먼저 두 가지 방식은 다음과 같습니다. 

1. Thread 클래스를 상속하는 방법

2. Runnable 인터페이스를 구현하는 방법

 

이 두 방법은 겉으로는 비슷해 보이나, 확장성, 코드구조, 사용목적에 차이가 있습니다. 

 

1. Thread 

- Thread 클래스를 상속하는 방법

- 다른 클래스를 상속할 수 없음

- 코드 재사용성이 낮음 (같은 로직을 다른 곳에서 재사용하려면 Thread 를 다시 만들어야 함)

- 객체 공유가 불가능함 (각 Thread  객체가 독립적임, Thread 인스턴스 자체가 실행됨)

class MyThread extends Thread {
    private int count = 0;

    public void run() {
        for (int i = 0; i < 5; i++) {
            count++;
            System.out.println(Thread.currentThread().getName() + " - count: " + count);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();

        t1.start();
        t2.start();
    }
}

 

 

위 코드를 보며 아래와 같이 확인할 수 있습니다. 

  • MyThread는 Thread를 상속했기 때문에 다른 클래스를 상속할 수 없음 (Java는 다중 상속이 불가능함).
  • t1과 t2는 각각 독립적인 Thread 객체이므로 count 값이 공유되지 않음 ( Thread 자체가 실행 단위라 객체를 여러 스레드에서 공유할 수 없음)
  • 같은 로직을 다른 클래스에서 재사용하려면 또 다른 Thread 클래스를 만들어야 함.

 

2. Runnable 

- Runnable 인터페이스를 구현하는 방법

- 다른 클래스 상속 가능

- 코드 재사용성 높음(다른 클래스에서도 사용 가능)

- 객체 공유 가능 (Runnable 객체를 여러 스레드에서 공유 가능)

 


class MyRunnable implements Runnable {
    private int count = 0;

    public void run() {
        for (int i = 0; i < 5; i++) {
            count++;
            System.out.println(Thread.currentThread().getName() + " - count: " + count);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyRunnable task = new MyRunnable();  // 하나의 객체 생성

        Thread t1 = new Thread(task);  // 같은 객체를 공유하는 스레드
        Thread t2 = new Thread(task);

        t1.start();
        t2.start();
    }
}

 

위 코드를 보며 아래와 같이 확인할 수 있습니다. 

  • 객체(task)를 공유할 수 있어, 데이터 공유 가능함
  • 코드 재사용성이 높음 (다른 클래스에서도 MyRunnable을 쉽게 활용 가능).
  • 다른 클래스를 상속할 수 있어 확장성이 좋음

 

이러한 특징들을 고려하면서 멀티스레딩 구현 시 필요에 맞게 활용하시기 바랍니다!