모든 쓰레드는 독립적인 작업을 수행하기 위해 자신만의 호출스택을 필요로 하기 때문에, 새로운 쓰레드를 생성하고 실행시킬 때마다 새로운 호출스택이 생성되고 쓰레드가 종료되면 작업에 사용된 호출스택은 종료된다.

DA1CD10F-17AA-49CF-BD41-3F40ECC3BCA7.jpeg

스케쥴러는 실행대기중인 쓰레드들의 우선순위를 고려하여 실행순서와 실행시간을 정하고, 각 쓰레드들은 작성된 스케쥴에 따라 자신의 순서가 되면 지정된 시간동안 작업을 수행한다.

main 쓰레드

main 메서드의 작업을 수행하는 것도 쓰레드이며, 이를 main 쓰레드 라고 한다. 프로그램을 실행하면 기본적으로 하나의 쓰레드를 생성하고, 그 쓰레드가 main 메서드를 호출해서 작업이 수행되도록 한다.

F2ABE58D-93C0-443C-9585-E49EBE3B6174.jpeg

프로그램은 실행중인 사용자 쓰레드가 하나도 없을 때 종료된다. main 메서드가 수행을 마쳤더라도 다른 쓰레드가 아직 작업을 마치지 않았다면 프로그램은 종료되지 않는다.

Thread.start()

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)

C7F61627-7B06-42A1-BB33-323E6CDDE535.jpeg

main 쓰레드는 이미 실행이 종료되어 호출스택이 소멸되었다. 또한, 쓰레드가 예외가 발생해서 종료되어도 다른 쓰레드의 실행에는 영향을 미치지 않는다.

Thread.run()

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)

C96EB74A-9245-4837-9F4D-9DC545139635.jpeg

Thread 객체의 run() 메서드를 실행했기 때문에 별도의 쓰레드 호출스택이 생성되지 않았다.