본문 바로가기
java

Runnable과 Thread의 차이점

by 포잉띠 2024. 9. 5.

Runnable 인터페이스

Runnable은 자바의 함수형 인터페이스로, 오직 하나의 메소드인 run() 메소드를 가지고 있다. 이 메소드 안에 스레드가 수행할 작업을 정의할 수 있다.

Runnable 인터페이스를 구현하는 클래스를 만들거나, 익명 클래스, 람다 표현식을 사용해 run() 메소드를 구현할 수 있다.

// Runnable 인터페이스를 구현하는 클래스
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Runnable running");
    }
}

// 실행
Thread thread = new Thread(new MyRunnable());
thread.start();

 

Runnalbe을 사용하면 여러 스레드에서 동일한 작업을 수행하도록 만들 수 있고, 스레드 풀과 같은 고급 기능을 쉽게 사용할 수 있다.

Runnable은 다른 클래스를 상속받을 수 있는 유연성을 제공한다.( 자바는 다중상속을 지원하지 않기 때문에 클래스가 이미 다른 클래스를 상속받고 있는 경우 Thread 클래스를 상속받을 수 없기 때문)

 

Thread 클래스

Thread는 자바의 클래스이며, 자체적으로 스레드를 생성하고 실행하는 기능을 가지고 있다.

Thread클래스는 Runnable 인터페이스를 구현하고 있으며, 이를 상속받아 run()메소드를 오버라이드 할 수 있다.

// Thread 클래스를 상속받아 run() 메소드 오버라이드
class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Thread running");
    }
}

 

Thread 클래스를 상속받으면 스레드와 직접적으로 연관된 메소드 (start(), sleep(), join() 등)를 쉽게 사용할 수 있다.

그러나 Runnable 인터페이스를 구현하는것과 다르게 클래스 상속의 유연성이 제한되기 때문에, 이미 다른 클래스를 상속받고 있는 경우에는 Thread를 상속받을 수 없다.

 

주요 차이점과 주요 사용처

주요 차이점

  1. 유연성 : Runnable 인터페이스는 다른 클래스를 상속받을 수 있는 유연성을 제공하지만 Thread 클래스를 상속받으면 다중 상속이 불가능하기 때문에 유연성이 제한됨
  2. 구현 방식 : Runnable은 단순히 작업을 정의하는 데 사용되며, 실제로 스레드를 생성하고 시작하는 것은 Thread객체가 담당한다. 반면 Thread클래스는 스레드를 생성하고 실행하는 데 사용된다.
  3. 스레드 관리 : Thread를 상속받으면 스레드 관리를 포함한 추가적인 기능을 제공하지만, 대부분의 경우 Runnalbe을 구현하고 이를 Thread에 전달하는 방식이 더 선호된다. 왜냐하면 코드의 재사용성과 유연성을 높이기 때문이다.

주요 사용처

  • Runnable 사용
    • 이미 다른 클래스를 상속받고 있거나, 스레드 실행 로직과 스레드 관리 기능을 분리하고 싶을 때
    • 스레드 풀과 함께 사용할 때
  • Thread 사용
    • 단순히 간단한 스레드를 만드러 실행할 때
    • 스레드 관리 기능이 필요할 때, 하지만 이 경우 대부분에 상황에서 Runnable을 사용하고 이를 Thread에 전달하는 방식으로 사용한다.