결론
Runnable을 사용해야 한다.
그 이유는 인터페이스를 구현하는 방법이 코드의 재사용성이 높고 코드의 일관성을 유지할 수 있다라는 장점이 있기 때문에 보다 객체지향적인 방법이라 할 수 있다.
- ps) 아래 start()와 run() 의 차이점에 대한 설명 있음
차이점
- Thread 클래스를 상속받는다.
- Runnable 인터페이스를 구현한다.
- 쓰레드를 구현하는 방법은 Thread 클래스를 상속받는 방법과 Runnable 인터페이스를 구현하는 방법, 모두 2가지 방법이 있다.
- 이 두가지 방법 중 어느 쪽을 사용해도 별 차이는 없지만, Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문에, Runnable 인터페이스를 사용하는 방법이 일반적이다.
구현 방법
- Thread 클래스 상속
public class ThreadEx1 extends Thread {
String ThreadName;
public ThreadEx1(String ThreadName) {
this.ThreadName=ThreadName;
}
@Override
public void run() {
for(int i=0;i<5;i++) {
System.out.println(ThreadName+i);
try {
Thread.sleep(100);
}catch (Exception e) {
// TODO: handle exception
}
}
}
public static void main(String[] args) {
ThreadEx1 tr = new ThreadEx1("Thread-");
tr.start();
}
}
- Runnable 인터페이스 구현
public class RunnableEx1 implements Runnable {
String ThreadName;
public RunnableEx1(String ThreadName) {
this.ThreadName=ThreadName;
}
@Override
public void run() {
for(int i=0;i<5;i++) {
System.out.println(ThreadName+i);
try {
Thread.sleep(100);
}catch (Exception e) {
// TODO: handle exception
}
}
}
public static void main(String[] args) {
RunnableEx1 runnable = new RunnableEx1("Thread-");
Thread tr = new Thread(runnable);
tr.start();
}
}
start() 와 run() 차이점
run()을 호출하는 것은 생성된 쓰레드를 실행시키는 것이 아니라 단순히 클래스에 속한 메서드 하나를 호출하는 것이다. 반면에 start()는 새로운 쓰레드가 작업을 실행하는데 필요한 호출 스택(call stack)을 생성한 다음에 run()을 호출해서, 생성된 호출스택에 run()이 첫 번째로 저장되게 한다.
참고 블로그
'JAVA > 쓰레드' 카테고리의 다른 글
[쓰레드] 프로세스와 쓰레드 차이 (0) | 2021.04.12 |
---|---|
[JAVA 쓰레드 #5] 데몬 쓰레드 (0) | 2021.02.03 |
[JAVA 쓰레드 #4] 쓰레드에서 값 반환 (0) | 2021.02.02 |
[JAVA 쓰레드 #3] 쓰레드 이름 설정 (0) | 2021.02.01 |
[JAVA 쓰레드 #2] Executor 기본 (0) | 2021.02.01 |