티스토리 뷰

728x90
반응형

Thread 클래스와 Runnable 인터페이스


Thread Class
  • Thread 클래스를 상속받는 경우에는 run() 메서드를 오버라이딩해야합니다.
  • Thread 클래스를 상속받아 사용하는 경우에는 정의된 각 스레드가 고유한 객체를 만들고 해당 객체와 연결이 됩니다.
Runnable Interface
  • Runnable 인터페이스를 구현하는 경우에는 run() 메서드를 구현해야합니다.
  • Runnable 인터페이스를 구현하는 경우 정의된 각 스레드는 같은 객체를 공유하게 됩니다.

 

 

Thread 흐름


 

Thread Class


  • 위에서 설명한거처럼 고유한 객체를 만들고 해당 객체의 start() 메서드를 호출하여 스레드를 동작시킵니다.
  • 여러개의 스레드가 필요한 경우 객체를 생성하여 스레드를 사용해야 합니다.
public class ThreadExample extends Thread{

    private static final Random RANDOM = new Random();

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println(name + " start");
        int delay = 1000 + RANDOM.nextInt(4000);

        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(name + " end (" + delay + "ms)");
    }
}

public class Example {
    public static void main(String[] args) {
        System.out.println("메인 메서드 호출 시작");

        // 스레드 객체 생성
        ThreadExample firstThread = new ThreadExample();
        firstThread.setName("first");

        // 스레드 객체 생성
        ThreadExample secondThread = new ThreadExample();
        secondThread.setName("second");

        firstThread.start();
        secondThread.start();

        System.out.println("메인 메서드 호출 종료");
    }
}

 

Runnable Interface


  • Thread 클래스를 상속받으면 스레드를 필요할 때마다 객체를 각각 생성해주어야합니다. 반면에 Runnable 인터페이스를 구현하게 된다면 하나의 객체를 공유하여 스레드 작업을 할 수 있습니다.
public class ThreadExample implements Runnable{

    private static final Random RANDOM = new Random();

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println(name + " start");
        int delay = 1000 + RANDOM.nextInt(4000);

        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(name + " end (" + delay + "ms)");
    }
}

public class Example {
    public static void main(String[] args) {
        System.out.println("메인 메서드 호출 시작");
        
        // 하나의 객체를 생성하여 자원 공유
        ThreadExample thread = new ThreadExample();

        Thread firstThread = new Thread(thread);
        firstThread.setName("first");

        Thread secondThread = new Thread(thread);
        secondThread.setName("second");

        firstThread.start();
        secondThread.start();
        System.out.println("메인 메서드 호출 종료");
    }
}

 

Thread 클래스와 Runnable 인터페이스 차이


각각의 인스턴스를 사용하느냐! 하나의 인스턴스를 공유하느냐!
  • Thread 클래스를 상속받아 사용하게 되면 스레드는 고유한 객체를 만들어 해당 객체와 연관시킵니다 (1 : 1)
  • Runnable 인터페이스를 구현한다면 스레드는 하나의 인스턴스를 공유하여 스레드를 작동시킵니다. (1 : N)
메모리
  • 위에서 Thread  클래스는 각각의 고유한 객체를 만들기 때문에 생성할 때마다 메모리를 잡아먹게되고 Runnable 인터페이스는 하나의 인스턴스를 공유하기 때문에 메모리가 적게 필요하게 됩니다.
다중 상속
  • 자바에서는 다중 상속을 허용하지 않기 때문에 Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없습니다. 반면에 Runnable 인터페이스를 구현하게 된다면 다른 인터페이스 뿐만 아니라 다른 클래스도 상속 받을 수 있습니다. 따라서 해당 클래스의 확장성이 더 중요한 상황이라면 Runnable 인터페이스를 구현하는게 더 바람직할 것 입니다.
느슨한 결합
  • Thrad 클래스를 상속받으면 Thread 클래스와 Thread 클래스의 작업이 동일한 클래스에 포함되므로 코드에서 밀접한 결합이 됩니다. 하지만 Runnable 인터페이스를 구현한 클래스는 스레드 코드가 스레드에 할당된 작업에서 분리되므로 코드에서 느슨한 결합을 가져옵니다.

 

728x90
반응형

'JAVA > JAVA기본' 카테고리의 다른 글

JAVA - Main Thread란(feat.동기화, 데드락)?  (0) 2022.01.27
JAVA - Thread란?  (0) 2022.01.27
JAVA - 예외 처리(try, catch, throw, throws, finally)  (0) 2022.01.26
JAVA - 인터페이스란?  (0) 2022.01.26
JAVA - Object 클래스란?  (0) 2022.01.16