얼마 전 개발 도중 어이 없는 실수를 저지른 적이 있었습니다.


바로 스레드를 start() 메소드가 아닌 run() 메소드로 실행한 것이죠.


그래서 오늘은 자바/안드로이드에서 스레드가 갖는 메소드인 


run()과 start()의 차이점에 대해 포스팅 해보겠습니다.



프로세스의 메모리 구조 - 스레드의 특징


 

두 함수의 차이점을 설명하기 전에 프로세스의 메모리 구조에 대해 설명하겠습니다.


위의 그림에서 왼쪽은 단일 스레드 프로세스, 오른쪽은 다중 스레드 프로세스를 나타냅니다.


하나의 프로세스는 stack, heap, static, code로 구성된 메모리 영역을 갖게 되는데


특이한 점은 다중 스레드 이용 시, 각 스레드는 heap, static, code 영역은 공유하지만


call stack 영역은 독립적으로 사용하게 됩니다.


Call stack에 대한 추가 정보(Wikipedia)

 


run()과 start()가 다르게 동작하는 이유


자바에서 스레드는 Thread 클래스를 상속받거나 Runnable 인터페이스를 구현하여 만들 수 있습니다.


가장 간단한 Runnable 인터페이스를 구현한 경우를 보면 아래와 같은 구조입니다.



위와 같은 스레드가 있다고 할 때, 


프로세스의 메인 스레드에서 run() 메소드를 호출하는 것은 


단순하게 오버라이딩 된 메소드를 호출해서 사용하는 것과 같습니다.


물론 메인 스레드의 call stack을 이용하기 때문에


 run() 메소드가 끝날 때까지 다른 작업을 하지 못합니다.


반면 start() 메소드를 호출할 경우, JVM은 스레드를 위한 call stack을 새로 만들기 때문에


run() 메소드 호출과는 다르게 진정한 스레드로서 독립적인 동작이 가능합니다.



+ Recent posts