Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java)에서 Thread와 Runnable의 차이점 완벽 정리

자바에서 새로운 실행 스레드를 생성하는 방법은 크게 두 가지가 있습니다. 첫 번째는 Thread 클래스를 상속하는 방식이고, 두 번째는 Runnable 인터페이스를 구현하는 방식입니다. 두 방식은 결과적으로 같은 작업을 수행하지만, 구조와 활용 측면에서 중요한 차이점이 있습니다.

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

Thread 클래스를 상속받은 하위 클래스를 선언하고, 부모 클래스의 run() 메서드를 오버라이딩합니다. 이후 해당 하위 클래스의 인스턴스를 생성하고 시작하면 새로운 스레드가 실행됩니다.

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

Runnable 인터페이스를 구현하는 클래스를 선언하고 run() 메서드를 작성합니다. 이 클래스의 인스턴스를 생성한 뒤, Thread 객체를 만들 때 생성자의 인자로 전달하고 시작하면 됩니다.

스레드 이름(Thread Name)

모든 스레드는 식별을 위한 고유한 이름을 가집니다. 여러 스레드가 동일한 이름을 가질 수도 있으며, 스레드 생성 시 이름을 지정하지 않으면 자동으로 새로운 이름이 생성됩니다.

Thread vs Runnable 핵심 차이점 비교

번호구분 기준ThreadRunnable
1기본 개념Thread는 클래스(Class)이며, 이를 통해 스레드를 생성합니다.Runnable은 함수형 인터페이스(Functional Interface)이며, 이를 통해 스레드를 생성합니다.
2메서드start(), run() 등 다양한 메서드를 제공합니다.추상 메서드 run() 하나만 가집니다.
3객체 공유각 스레드마다 고유한 객체를 생성하여 연결됩니다.여러 스레드가 동일한 객체를 공유할 수 있습니다.
4메모리 사용량더 많은 메모리가 필요합니다.상대적으로 적은 메모리가 필요합니다.
5제약 사항자바는 다중 상속을 지원하지 않으므로, Thread 클래스를 상속하면 다른 클래스를 더 이상 상속받을 수 없습니다.Runnable 인터페이스를 구현하면 다른 클래스를 동시에 상속받을 수 있습니다.

Runnable 구현 예제

class RunnableExample implements Runnable{
    public void run(){
        System.out.println("Thread is running for Runnable Implementation");
    }
    public static void main(String args[]){
        RunnableExample runnable=new RunnableExample();
        Thread t1 =new Thread(runnable);
        t1.start();
    }
}

Thread 상속 예제

class ThreadExample extends Thread{
    public void run(){
        System.out.println("Thread is running");
    }
    public static void main(String args[]){
        ThreadExample t1=new ThreadExample ();
        t1.start();
    }
}

어떤 방식을 선택해야 할까?

일반적으로 Runnable 인터페이스 구현 방식이 권장됩니다. 자바는 단일 상속만 허용하기 때문에 Thread 클래스를 상속하면 다른 클래스를 확장할 수 없게 되어 유연성이 떨어집니다. 반면 Runnable을 구현하면 상속 계층을 자유롭게 유지하면서 스레드 기능을 추가할 수 있고, 메모리 효율성과 객체 공유 측면에서도 유리합니다. 특히 스레드 풀(Thread Pool)이나 ExecutorService와 함께 사용할 때는 Runnable 방식이 사실상 표준으로 자리 잡고 있습니다.