본문 바로가기

old drawer/Java

[Java] Runable과 Thread의 차이점


Thread의 사용방법
: http://scarlett.tistory.com/entry/Thread-2Thread의-사용방법

Thread와 Thread의 상속 : http://scarlett.tistory.com/entry/Thread-3Thread와-Thread의-상속

간단한 Thread 검색 프로그램 : http://scarlett.tistory.com/entry/Thread-4간단한-Thread-검색-프로그램

 

 

쓰레드를 구현하는 방법은 Thread클래스를 상속받는 방법과 Runnable인터페이스를 구현하는 방법, 모두 2가지가 있다. 이 두 가지 방법 중 어느 쪽을 사용해도 별 차이는 없지만 Thread클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문에, Runnable인터페이스를 구현하는 방법이 일반적이다.

 

Runnable인터페이스를 구현하는 방법은 재사용성(reusability)이 높고 코드의 일관성(consistency)을 유지할 수 있다는 장점이 있기 때문에 보다 객체지향적인 방법이라 할 수 있겠다.

 

1. Thread클래스를 상속

 

class ThreadExtends extends Thread {

public void run() {

// 작업내용 

} // Thread클래스의 run()을 오버라이딩

}

 

 

2. Runnable인터페이스를 구현

 

class RunnableImplements implements Runnable {

public void run() {

// 작업내용 

} // Runnable인터페이스의 추상메서드 run()을 구현

}

 

쓰레드를 구현한다는 것은 위의 2가지 방법 중 어떤 것을 선택하건 간에, 쓰레드를 통해 작업하고자 하는 내용으로 run()의 몸통을 채우기만 하면 되는 것이다.

 

 

Thread클래스를 상속받은 경우와 Runnable인터페이스를 구현한 경우의 인스턴스 생성방법은 다릅니다.

 

1. Thread클래스를 상속받아 실행

ThreadExtends te = new ThreadExtends();

te.start(); 

 

2. Runnable인터페이스를 구현하여 실행

 

Runnable r = new RunnableImplements();

Thread t = new Thread(r);

t.start(); 

 

 

여기서 한 가지 더 알아 두어야 할 것은 한 번 사용한 쓰레드는 다시 재사용할 수 없다는 것이다. 즉, 하나의 쓰레드에 대해 start()가 한 번만 호출될 수 있다는 뜻이다.

 

 

start()와 run()에 대한 차이와 쓰레드가 실행되는 과정

 

run()을 호출하는 것은 생성된 쓰레드를 실행시키는 것이 아니라 단순히 클래스에 속한 메서드 하나를 호출하는 것이다. 반면에 start()는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택(call stack)을 생성한 다음에 run()을 호출해서, 생성된 호출스택에 run()이 첫 번째로 저장되게 한다.

 

1. main메서드에서 쓰레드의 start메서드를 호출한다.

2. start메서드는 쓰레드가 작업을 수행하는데 사용될 새로운 호출스택을 생성한다.

3. 생성된 호출스택에 run메서드를 호출해서 쓰레드가 작업을 수행하도록 한다.

4. 이제는 호출스택이 2개이기 때문에 스케줄러가 정한 순서에 의해서 번갈아 가면서 실행된다. 

 

한 쓰레드에서 예외가 발생해서 종료되어도 다른 쓰레드의 실행에는 영향을 미치지 않는다. 

<출처>
http://blog.daum.net/_blog/BlogTypeView.do?blogid=0OZ7Y&articleno=138&categoryId=0&regdt=20100310164312#ajax_history_home

'old drawer > Java' 카테고리의 다른 글

[Java] enum 사용법  (0) 2011.06.17
[Java] Thread.interrupt() 사용법  (0) 2011.06.11
[Java] Painting in AWT and Swing  (0) 2011.06.08
[Java] AWT와 Swing의 차이점  (1) 2011.06.07
Java에서 implements Serializable(객체 직렬화)란?  (0) 2011.05.24