모든 쓰레드는 독립적인 작업을 수행하기 위해 자신만의 호출스택을 필요로 하기 때문에, 새로운 쓰레드를 생성하고 실행시킬 때마다 새로운 호출스택이 생성되고 쓰레드가 종료되면 작업에 사용된 호출스택은 종료된다.
스케쥴러는 실행대기중인 쓰레드들의 우선순위를 고려하여 실행순서와 실행시간을 정하고, 각 쓰레드들은 작성된 스케쥴에 따라 자신의 순서가 되면 지정된 시간동안 작업을 수행한다.
start()
: 새로운 쓰레드를 생성하고, 쓰레드가 작업하는데 사용될 호출스택을 생성한다. 생성한 후 해당 쓰레드의 run()
메서드를 호출한다.run()
: 쓰레드의 로직을 수행한다.main 메서드의 작업을 수행하는 것도 쓰레드이며, 이를 main 쓰레드
라고 한다. 프로그램을 실행하면 기본적으로 하나의 쓰레드를 생성하고, 그 쓰레드가 main 메서드를 호출해서 작업이 수행되도록 한다.
프로그램은 실행중인 사용자 쓰레드가 하나도 없을 때 종료된다. main 메서드가 수행을 마쳤더라도 다른 쓰레드가 아직 작업을 마치지 않았다면 프로그램은 종료되지 않는다.
class ThreadEx2 {
public static void main(String args[]) throws Exception {
ThreadEx2_1 t1 = new ThreadEx2_1();
t1.start(); // start 실행
}
}
class ThreadEx2_1 extends Thread {
public void run() {
throwException();
}
public void throwException() {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
java.lang.Exception
at ThreadEx2_1.throwException(ThreadEx2.java:15)
at ThraedEx2_1.run(ThreadEx2.java:10)
main 쓰레드는 이미 실행이 종료되어 호출스택이 소멸되었다. 또한, 쓰레드가 예외가 발생해서 종료되어도 다른 쓰레드의 실행에는 영향을 미치지 않는다.
class ThreadEx3 {
public static void main(String args[]) throws Exception {
ThreadEx3_1 t1 = new ThreadEx3_1();
t1.run(); // run 실행
}
}
class ThreadEx3_1 extends Thread {
public void run() {
throwException();
}
public void throwException() {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
java.lang.Exception
at ThreadEx3_1.throwException(ThreadEx3.java:15)
at ThreadEx3_1.run(ThreadEx3.java:10)
at ThreadEx3.main(ThreadEx3.java:4)
Thread 객체의 run()
메서드를 실행했기 때문에 별도의 쓰레드 호출스택이 생성되지 않았다.