둘다 큰 파이는 없지만 Runnable 인터페이스를 구현하는 것이 일반적이에요. 왜냐하면 재사용성(Reusability)과 일관성(Consistency)을 유징할 수 있기 때문에 보다 객체지향적인 방법이에요.
Runnable interface 는 오로진 run()만 정의되어 있는 간단한 인턴페이스로
구현가이 위해서 추상메서드인 run()의 몸통{}부를 만들어 주는 것이에요.
즉, 쓰레드를 구현한다는 것은 두 방법 중 어떤 것을 택하든지 쓰레드를 작업하고자 하는 채용으로 run()의 몸통부{}를 채우는 것일 뿐이에요.
public static void main(String args[]) {
ThreadEx1_1 t1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2();
Thread t2 = new Thread(r);
t1.start();
t2.start();
}
class Thread1_1 extends Thread { //1. Thread 클래스 상속
public void run();{
for(int i = 0 ; i < 5 ; i++) {
// 조상 Threaddml getName()호출
System.out.print.ln(this.getName());
}
}
]
Class ThredEx1_2 implements Runnable{ // 2.Runnable 인터페이스
public void run() {
for(int i = 0 ; i < 5 ; i ++){
//Thread.currentThread() - 현재 실행중인 Thread를 반환한다.
System.out.println(Thread.currentThread().getName());
}
}
}
run의 몸통{}부를 채워 넣었는데 왜 쓰레드를 실행시키는 메서드는 start()일까?
start() 메서드를 실행하면 새로운 stack을 생성시키고 그 위에 run()을 올려주기 때문이다.
쓰레드를 구현 후에 start()호출해야 쓰레드가 작업을 시작해요.
Thread의 실행순서는 OS의 스케쥴러가 결정하기 때문에
먼저 thread를 start를 했다고 먼저 실행되는 것은 아니고, OS의 스케쥴러에 종속적이다.