Do Not Think!!!

Posted
Filed under 글로 기록하기
어제 하루종일 Thread 때문에 삽질을 했습니다.

Thread를 만들어서 실행시키는데,  Thread가 순차적으로 실행이 되는 문제였습니다.

오늘에서야 그 이유를 알았는데, 원인은 저의 무지 때문이었습니다.


별다른 생각 없이, 정말 아무 이유없이...

이클립스 자동완성 기능 사용 중, run()이 start() 보다 위에 있다는 이유때문에...
사용자 삽입 이미지

start()와 run()이 같은 동작을 하겠거니... 이런 생각에...

new Thread().run() 을 해버렸습니다.

어제 하루종일 start()와 run()의 차이점을 인식하지 못하고, 애꿎은 컴퓨터만 탓했습니다.



오늘에서야 start()와 run()이 다르다는 것을 인지하고, 두개의 차이점을 찾아봤습니다.

Thread.java - start() (Language : java)
public synchronized void start()
{
    if (vmThread != null || group == null)
        throw new IllegalThreadStateException();

    VMThread.create(this, stacksize);
}

Thread.java - run() (Language : java)
public void run()
{
    if (runnable != null)
        runnable.run();
}


start()는 실제 native 쓰레드(VMThread)를 생성하고, 새롭게 만들어진 native 쓰레드가 run()을 실행 하고, run()은 단지 Runnable 객체의 run()을 호출하는 것입니다.

즉, start()를 하기 전에는 new Thread()는 단지 하나의 객체일 뿐이고, start()를 해야만, 실제 쓰레드가 만들어지는 것입니다.



완전히 다르게 동작하는데, 이걸 똑같이 동작하다고 생각했었다니... 정말 창피합니다.


잘못된 코드 (Language : java)
new Thread().run()

수정한 코드 (Language : java)
new Thread().start()

Bigstone

이걸 글로 남겨 놓다니.. -_-a;;

조영운

머... 다음에 또 실수를 하지 말자는 의미지...

꼭 까칠하게 따져야 하는가? ㅡ.ㅡa

s

몰랐던 사람에게는 참 좋은 내용 이네요.(저도 정확히 몰랐는데 여기서 조금 더 이해가 됐고요) 빅스톤님은 뭐가 불만이신건지 ㅋㅋㅋㅋ

조영운

아주 오래전 포스팅인데, 도움이 되셨다니 기분이 좋습니다.
빅스톤은 잘난 제 친구입니다~ ㅋㅋㅋ