Java

[스크랩][JAVA] Thread run()과 start()의 차이

Binceline 2012. 10. 17. 16:38


출처 : http://blog.naver.com/zzooki/90035010576

---------------------------------------------------------

run()과 start()

 - 앞서 포스트에서 분명 일거리를 run()메소드 내에 정의해주었는데도 불구하고, 실제로 스레드에게 작업을 시킬 때에는 run()이 아닌 start()메소드를 통해 작업을 지시하였다.

 

왜???

run()으로 작업지시를 하면 스레드가 일을 안하나?

실제로 그렇진 않다..(아니..그렇다고 해야하나....?)

간단히 말해 해당 스레드에게 run()메소드로 지시를 내려도 동일한 작업을 한다.

하지만 그건 제대로 된 작업이 아니다.

 

이전 포스팅(JAVA의 메모리 구조)를 보면 Call Stack이란게 있다.

바로 이 메모리 영역이 실제적인 명령어들을 담고 있는 메모리로 콜스택의 명령들을 하나씩 꺼내어 실행시킨다고 했다.

 

그렇다면 동시에 두가지 작업을 하려면?

그렇다..두 개 이상의 콜스택이 필요하다!!!!!

그리고 바로 이부분에서 run()과 start()의 차이가 난다.

 

스레드를 이용한다는 것을 다시 말하자면 다수의 콜스택을 이용하여 다수의 콜스택들을 번갈아 가면서(이건 JVM의 뜻대로) 적당히 동시에 여러작업을 하는 것같이(뭐 실제로 동시에..맞나?...엄연히 한시점에선 한가지 작업만 하지만....) 보이게 하는 것이다.

그리고 run()을 호출하는 것은 원래 main()의 콜스택 하나만 이용하는 것이다.

그러므로 결국 스레드를 이용하는 것이 아닌 것이다!!!

 

그러면?..우리가 콜스택을 하나 새로 만들고 그 안에 스레드의 작업내용을 넣어줘야 하느냐?

알다시피 그건 아니다....

단지 스레드의 start()메소드를 호출하는 것만으로 JVM녀석은 스레드를 위한 콜스택을 새로 만들어주고, 알아서 문맥교환해주고 스레드를 스레드답게 동작하도록 만들어 준다..(기특한 녀석...)

 

그렇다. run()을 호출하는 것은 단지 스레드 객체의 run()이라는 메소드를 호출하는 ..단지 그것뿐이다. 그리고 run()메소드의 할일을 하고 끝나겠지....우리가 원하는 건 새로운 콜스택인데!!!

고로....start()와 run()의 차이는.....

스레드를 제대로 사용하느냐...사용할줄 모르느냐의 차이!!!!

반응형