쓰레드의 기본적 구현과 실행
1. 쓰레드의 구현 방식
- 쓰레드 구현의 방식은 두 가지가 있는데, Thread 클래스를 상속받는 방법과 Runnable 인터페이스를
구현하는 방법이 있다.
( 어느 쪽이든 별 차이는 없지만 Thread를 상속받는다면 다른 클래스를 상속 못 받기 때문에, 인터페이스로
구현하는 것이 일반적이다. )
( 인터페이스 구현은 재사용이 높고 일관성을 유지하기에 객체지향적 방법이라고 말할 수 있다. )
1-1. 쓰레드 구현을 이해하기 위한 예제(1)
: 상속을 받는 것과 인터페이스를 구현하는 방법을 알아보는 예제이다.
import java.util.*;
public class Exercise001 {
public static void main(String[] args) {
ThreadEx1 t1 = new ThreadEx1();
Runnable r1 = new ThreadEx2();
Thread t2 = new Thread(r1);
//= Thread t2 = new Thread(new ThreadEx2);
t1.setName("Thread 쓰레드");
t1.start();
t2.setName("Runnable 쓰레드");
t2.start();
}
}
class ThreadEx1 extends Thread{
public void run() {
for(int i=0; i<5; i++) {
System.out.println(getName());
}
}
}
class ThreadEx2 implements Runnable{
public void run() {
for(int i=0; i<5; i++) {
System.out.println(Thread.currentThread().getName());
//Thread t = Thread.currentThread();
//println(t.getName());
}
}
}
( run()을 실행해야 돌아갈 거 같은 쓰레드는 run()을 호출하지 않고, start()을 통해 실행해야 돌아간다. )
( 또한 start()가 실행되었다고 무조건 실행되지 않는다. 그 이유는 앞에 쓰레드가 있었다면 대기상태로 대기
해야하기 때문이다. )
( 한 가지 알아두어야 할 점은 한 번 실행이 종료된 쓰레드는 다시 실행할 수 없다. )
( 그래서 한 번 실행된 인스턴스를 다시 new 를 통해서 다시 생성 후 실행시킨다. 만약 이것을 어긴다면,
IllegalThreadStateException이 발생한다. )
2. start()와 run()
- start()는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택을 생성한다.
- run()은 start()가 만들어준 호출스택에서 첫 번째로 올라가게 한다.
- 아래는 start()와 run() 수행 시, 일어는 과정을 설명한다.
( (4)번에서는 최종적으로 쓰레드를 생성한 상태이며, 스케줄러가 정한 순서에 의해서
번갈아 가면서 실행한다. )
( 또한 위의 호출스택은 실행중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다. )
( 만약 main 스택에서 run()을 호출한다면, 새로운 쓰레드가 생성되지 않고 바로 main 스택에
올라오게 된다. )