Java

[Java] 주니어 백엔드 면접 단골 질문 - 쓰레드를 생성하는 2가지 방법

코리늬 2021. 3. 20. 16:14

면접에서 쓰레드에 대한 질문을 높은 빈도로 받았었다.

만족하실만한 대답을 못했던 것 같다.

 

쓰레드를 생성하는 2가지 방법

  1. Runnable 인터페이를 확장해 run() 메소드 구현
  2. Thread 클래스를 상속받고 run() 메소드를 오버라이딩해 구현

 

  • 둘 중에 뭐가 더 좋을까??

Runnable 인터페이스를 확장하는 방법.

 

  • 왜?

extends과 implements의 차이점에서 알 수 있다.

extends을 받으면 내가 받고 싶지 않은 메소드도 상속 받게 되는 문제가 생긴다.

또한 private가 아닌 메소드나 변수를 자식 클래스가 받게 되고 낭비가 생긴다.

따라서 인터페이스 확장 방식을 사용해 필요한 기능만 갖게 되고 결합도를 낮추는 방식이 객체지향적으로 적합하다.

 

  • 쓰레드를 실행시키는 방법은?

1) extends를 사용한 쓰레드 생성 방법

public class ThreadExtends extends Thread{

    String thread;
    public ThreadExtends(String thread){
        this.thread = thread;
    }

    public void run(){
        for(int i=0; i<10; i++){
            System.out.println("extends 쓰레드 : " + thread);
            try{
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ThreadExtends t1 = new ThreadExtends("상속 1번");
        ThreadExtends t2 = new ThreadExtends("상속 2번");

        t1.start();
        t2.start();
        System.out.println("finish");
    }
}

 

2) implements를 사용한 쓰레드 생성 방법

public class ThreadRunnable implements Runnable{

    String thread;
    public ThreadRunnable(String thread){
        this.thread = thread;
    }

    @Override
    public void run() {
        for(int i=0; i<10; i++){
            System.out.println("implements 쓰레드 : " + thread);
            try{
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ThreadRunnable tr1 = new ThreadRunnable("확장 1번");
        ThreadRunnable tr2 = new ThreadRunnable("확장 2번");

        Thread t1 = new Thread(tr1);
        Thread t2 = new Thread(tr2);

        t1.start();
        t2.start();
        System.out.println("finish");
    }
}

implements 방식은 쓰레드를 직접적으로 상속받아 사용하는것이 아니기 때문에, 예제에서 보다시피 쓰레드를 따로 생성 후, 생성자에 ThreadRunnable를 인자로 주어 생성한다.

 

  • 쓰레드를 중지시키는 방법?

interrupt() 사용