HelloThread - 스레드 생성
스레드를 생성해보자.
클래스에 Thread 를 상속 받고 run 메서드를 재정의하면 된다!
public class HelloThread extends Thread {
@Override
public void run() {
System.out.println(
Thread.currentThread().getName() + " : run()");
}
}
HelloThreadMain
- 해당 코드를 실행하는 스레드 이름을 출력한다 Thread.currentThread().getName()
- 그래서 메인 메서드를 실행하는 main 이라는 스레드명이 제일 처음에 출력된다.
- 누가 이 코드를 실행하는지 스레드명을 확인하면서 학습하자.
public static void main(String[] args) {
/** Thread.currentThread().getName() -> 스레드명이 main 이라고 출력된다 */
System.out.println(Thread.currentThread().getName() + ": main() start");
HelloThread helloThread = new HelloThread(); // HelloThread 객체를 생성
System.out.println(Thread.currentThread().getName() + ": start() 호출 전 ");
helloThread.start(); // start() 를 호출한다 !
// 이 시점부터 main 스레드와 Thread-0 이 동시에 실행된다.
System.out.println(Thread.currentThread().getName() + ": start() 호출 후 ");
System.out.println(Thread.currentThread().getName() + ": main() end");
}
- HelloThread 인스턴스를 생성하고 HelloThread helloThread = new HelloThread()
- 이것은 인스턴스 생성만 됬을 뿐, 스택 프레임이 할당된 게 아니다.
- start() 를 호출한다. helloThread.start()
중요 - 어느 시점에 새로운 스택 프레임이 생성될까
- helloThread.start() 를 호출하면, HelloThread 의 스택 프레임이 생성된다.
- (main 스레드와는 별도의 스택 프레임이다)
- 그리고 HelloThread 가 run() 를 호출한다.
- 주의할 점은 main 스레드가 아니라, HelloThread 가 run() 을 호출한다는 점이다.
- main 스레드는 단지 helloThread.start() 호출을 통해서 다른 스레드에게 일을 시작하라고 지시할 뿐이다.
스레드 간의 실행 순서와 실행 기간을 둘 다 보장하지 않는다.
- 스레드는 동시에 실행되기 때문에 실행 순서는 얼마든지 달라질 수 있다.
main: main() start
main: start() 호출 전
main: start() 호출 후
Thread-0 : run()
main: main() end
- 실행 할 때마다 조금 달라진다. Thread-0 이 제일 밑에 출력될 때도 있다
main: main() start
main: start() 호출 전
main: start() 호출 후
main: main() end
Thread-0 : run()
정리
- 스레드 객체를 생성하고, 반드시 start() 를 호출해야 스택 공간을 할당 받고 스레드가 작동한다.
- 스레드는 순서와 실행 기간을 모두 보장하지 않는다! 이것이 멀티스레드다.
728x90