본문 바로가기
Development/JAVA

[자바]Runnable과 쓰레드(Thread)와의 관계

by True Life 2015. 12. 21.


자바 프로그래밍 - Runnable


이 글을 보시기 전에 Thread에 대해서 익혀오시는걸 추천합니다 ^^;

아, extends(상속)과 implements(인터페이스)의 차이점에 대해서도 포스팅 해놓도록 하겠습니다~


 [자바-Java]쓰레드-Thread

[자바-Java]extends와 implements의 차이점


요점은! 결국에 Runnable == Thread 라고 하셔도 무방합니다. (퍼퍽..)

죄송합니다. Runnable != Thread(상속)..! 다릅니다. 사용을 잘 구분하셔야되요ㅎ..


단지 같은점은 run()을 정의해야 한다는 것입니다.

이 run은 Thread에서 실행되는 메소드인데 그 run이 Thread를 extends함으로써 @override(오버라이딩)될 것이냐, 또는 Runnable 인터페이스를 구현함으로써 추상메소드를 오버라이딩 할 것이냐에 따라 다른 것입니다.


자, 뭐가 다른가! 몇가지 다른점을 정리합니다.


1. Thread는 상속을 받으며 Runnable은 인터페이스로서 구현한다

2. Thread는 재사용이 불가능하며 Runnable은 가능하다

3. Thread 사용시 다른 클래스를 상속받을 수 없다 (1번과 똑같은 의미겠죠?)

4. Runnable Implements는 보다 객체지향적이다 (독립된 class 선언)


잠깐, 너무 Thread 상속이 안좋은것 같잖아요!

5. Thread 사용시 그 class를 바로 사용할 수 있다. (해당 class의 Method를 사용가능함)

 - Runnable 사용시 다른 클래스에서 implements를 할 경우 해당 class Method 이용불가

  * 하지만 4번 항목과 더불어 객체지향의 특징일 수 있겠죠!?


자, 자바 Oracle에서는 Runnable을 다음과 같이 정의했습니다.


The Runnable interface should be implemented by any class whose instances are intended to be executed by a thread. The class must define a method of no arguments called run.


 - Runnable 인터페이스는 thread에 의해 실행될 class에 implements 되어야한다. 이 클래스는 인자가 없는 run() method를 정의해야 한다.




여기까지 개략적 설명을 마치고 Thread vs Runnable 예제 하나만 보죠..


- 쓰레드 상속 -



- Runnable 인터페이스 -


어렵지 않죠, 그럼 이 둘중 애용해야 하는 것은?

음, 사실 답은 없습니다.(이런 문제에 대해서는 조금 조심스러워야되요^^;)

저는 Runnable implements를 주로 사용하지만 편리하기에는(그리고 약간이나마 소스가 짧아지기도 하죠ㅎ) Thread를 상속하는게 더 나을 수도 있어요~ 자, 결과적으로는 우리는 run() 만 잘 채워넣으면 됩니다.



다음 포스팅은 마찬가지로 쓰레드 관련! 동기화를 알아보겠습니다!


 [자바-Java]쓰레드, 동기화(Synchronization)와 교착상태(Deadlock)