본문 바로가기
Programing General/Java

[Java] Runnable과 Thread의 차이 및 간단한 실행 예제

by Gnaseel 2020. 5. 7.
728x90
반응형

보통 자바에서 쓰레드를 구현할 때 두가지 방법을 사용한다.

Thread, Runnable 두 방법이 있는데, Runnable은 이름에서 느껴지지만 클래스가 아닌 인터페이스다.

 

그래서 위 두 방법을 구체적으로 설명하자면

1. Thread 클래스를 상속받는다.

2. Runnable 인터페이스를 구현한다.

로 정리할 수 있다.

 

한 가지 목적에 두 가지 방법이 있다면 각각 설계 된 이유가 있을 것이다.

하지만 한국 웹을 아무리 뒤져봐도 두 방법의 사용법의 차이 및 상속&구현의 차이만 말할 뿐

왜 이 두 가지 방법이 존재하는지에 대한 설명은 없었다.

 

그래서 자바 api를 잠시 살펴봤다.

흥미로운 것을 발견했는데, Thread 클래스는 Object를 상속받으며 Runnable 인터페이스를 구현한다는 것이다.

 

그리고 더 흥미로운 것은 Thread 클래스의 생성자에 Runnable 인터페이스를 사용한다는 것이다.

 

그래서 아마 내 예상에는 Runnable은 인터페이스의 특성상 생성자가 없고 객체를 만들 수 없으니,

객체를 만들어 사용하는 용도로 Thread 클래스를 만든 것이 아닐까 싶다. (추정)

영문 웹을 뒤져 이유를 알아내면 수정하겠다.

 

즉, 우리가 자바에서 멀티쓰레드 환경을 조성할 수 있는 방법은 더 직접적으로 표현하자면

1. Runnable 인터페이스를 구현해서, Thread 객체를 직접 만들어 사용.

2. Runnable 인터페이스를 구현한 Thread 클래스를 사용.

 

 

이제부터는 간단한 예제로 멀티쓰레드 환경을 조성해보겠다.

 

1. Thread 클래스를 상속받아 사용

run 메소드를 오버라이딩 해서 사용하고, 간단하게 쓰레드의 이름과 반복문의 인덱스를 출력한다.

 

메인 함수이다.

순서대로 쓰레드를 3개 생성하고, 1, 2, 3이라는 이름을 붙이고, 실행시킨다.

 

결과 콘솔을 보면 멀티 쓰레드 환경이기 때문에 동시다발적으로 진행되는 것을 볼 수 있다.

 

2. Runnable interface를 구현해서 사용

 

사실상 이전의 Mythread와 달라진 것이 없다.

하나 있다면, Thread는 자신이 객체이기 때문에 이름을 표현할 때 this.getName을 사용했지만

Runnable은 자신을 사용해서 객체를 만들기 때문에 객체의 이름을 표현할 때 static method를 사용했다.

 

첨언이지만 static method는 객체지향 원칙을 저해하는 하나의 원인이 될 수 있기 때문에, 

때와 장소를 가려 적재적소에만 활용하도록 하자.

 

메인 함수다.

아까와 내용이 같아 설명하기 민망하지만, MyRunnable 객체를 만들고, 그 객체를 활용해 Thread 객체를 만들고, Thread 객체에 이름을 붙이고, Thread를 실행시킨다.

 

일반적인 방법은 Runnable 인터페이스를 구현해서 사용하는 것이라고 하는데,

다중상속이 불가능한 자바의 특성을 생각한다면 당연한 일이다.

 

프로세스 스케쥴러를 만들라는 학교의 팀 프로젝트 과제로 인해 멀티쓰레드에 대해서 공부하게 되었는데,

단순한 사용법이 아닌 단일쓰레드와 다르게  내부에서 어떤 작업이 이루어지는지 더 알아봐야겠다.

반응형