start()와 run()

양성빈·2022년 8월 12일
post-thumbnail

참고
자바의 정석

start()와 run()

쓰레드를 시작할 때 start() 메서드를 통하여 실행한다. 그러면 start()와 run()의 차이가 무엇일까?

main 메서드에서 run()을 호출하는 것은 생성된 쓰레드를 실행시키는 것이 아니라 단순히 클래스에 선언된 메서드를 호출하는 것일 뿐이다. 반면에 start()는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택을 생성한 다음에 run()을 호출해서 생성된 호출스택에 run()이 첫번째로 올라가게 된다.

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

새로운 쓰레드르 생성하고 start()를 호출한 후 호출스택 변화
1. main 메서드에서 쓰레드의 start()를 호출한다.
2. start()는 새로운 쓰레드를 생성하고 쓰레드가 작업하는데 사용될 호출스택을 생성한다.
3. 새로 생성된 호출스택에 run()이 호출되어, 쓰레드가 독립된 공간에서 작업을 수행한다.
4. 이제는 호출스택이 2개이므로 스케줄러가 정한 순서에 의해서 번갈아 가면서 실행된다.

스케줄러는 실행대기중인 쓰레들의 우선순위를 고려하여 실행순서와 실행시간을 결정하고, 각 쓰레들은 작성된 스케줄에 따라 자신의 순서가 되면 지정된 시간동안 작업을 수행한다. 이 때 주어진 시간동안 작업을 마치지 못한 쓰레드는 다시 자신의 차례가 돌아올 때까지 대기상태로 있게 되며, 작업을 마친 쓰레드, run()의 수행이 종료된 쓰레드는 호출스택이 모두 비워지면서 호출스택도 사라진다.

main 쓰레드

main 메서드의 작업을 하는 것도 쓰레드이며, main 쓰레드라고 불린다. 또한 main 쓰레드가 종료되었더라도 다른 쓰레드가 작업중이라면 프로그램은 종료되지 않는다.

실행중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다.

profile
모든 것을 즐길줄 아는 개발자입니다!

0개의 댓글