woowacourse-study / 2022-modern-java-in-action

우아한테크코스 4기 모던 자바 인 액션 스터디
10 stars 4 forks source link

Runnable이란 무엇일까? #19

Open syoun602 opened 2 years ago

syoun602 commented 2 years ago

문제

Thread 클래스와 Runnable 인터페이스

선정 배경

동작 파라미터화를 설명하기 위해 예시를 들었던 Runnable 인터페이스에 대해 궁금증이 생겨 알아보게 되었다.

관련 챕터

syoun602 commented 2 years ago

Thread와 Runnable이란?

소프트웨어와 하드웨어에서 우리는 어떤 이벤트가 발생하면 그 이벤트에 맞게 여러 동작들이 일어나는데, 이때 동작은 하나의 프로세스(Process)이다. 프로세스 안에는 스레드(Thread)가 존재하는데, 프로세스와 쓰레드는 독립적으로 동작한다.

작업자들은 같이 협력해서 일을 하지만 사실 여기서 동작은 각각 따로, 즉 독립적으로 움직인다.

(그 개수에 따라 싱글 스레드 또는 멀티 스레드로 표현된다.)

스레드를 하나 더 만드는 것은 일할 수 있는 일꾼을 하나 더 만드는 것과 비슷하다.

프로세스란?

자바에서 쓰레드를 구현하는 방식에는 두 가지가 있다.

  1. Thread를 이용하는 방법

  2. Runnable을 이용하는 방법

  3. Thread 이용

Thread 클래스에는 많은 메소드가 존재하는데, 이때 Thread 클래스를 확장하고 싶다면 run() 메서드만 오버라이딩해주면 된다.

public class ExtendedThread extends Thread {
    // do something
}
  1. Runnable 이용

클래스 이름 뒷 부분을 extends Thread 에서 implements Runnable 로 변경하면 된다. 이때 Runnable은 구현할 메서드가 run() 하나 뿐인 함수형 인터페이스이다.

public class ImplementedRunnable extends Runnable {
    // do something
}

Thread vs Runnable

Thread 클래스를 확장하는 것이 실행 방법에 더 미세하게 간단하다. 하지만, 자바에서는 다중 상속을 허용하지 않아 Thread 클래스를 확장하는 클래스를 다른 클래스에서 상속 받을 수 없다. 그에 반에 Runnable 인터페이스를 구현한다면 다른 인터페이스를 구현할 수 있으며 다른 클래스도 상속 받을 수 있다.

따라서 해당 클래스의 확장성이 중요하다면 Runnable 인터페이스를 구현하는 것이 더 바람직하며 많은 개발자들이 대부분의 상황에서 Thread 클래스를 확장하기보다는 Runnable 클래스를 구현한다.