자바 run()과 start() 의 관계

dnking2의 이미지

public class A extends Thread {
	int count = 0;
	public void run(){
	        System.out.println("run");
	synchronized (this) {
	        for(int i =0; i < 50 ; i++){
	               count = count + i;
	        }
	        }
	} 
}

-----------------------------------------
public class Test {
	public static void main(String argv[]) {
        A a = new A();
        a.start();
        synchronized (a) {
               System.out.println("wating");
               try{
            	   a.wait();
               }catch(InterruptedException e){
               }
               System.out.println(a.count);
} }
}

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

코드 결과 값은
wating
run
1225
입니다.

그런데 제가 이해가 되지 않는 부분은,
start() 를 할 때 왜 run() 이 실행되지 않았냐는 것입니다.

제가 너무 단편적으로 외워 그런지 어렵네요..

세벌의 이미지

kldp에 들여쓰기 제대로 나타나게 글 쓰는 방법
code 태그를 쓰세요.

https://kldp.org/node/158191 참고...

dnking2의 이미지

수정하였습니다
감사합니다

wjddndyd401의 이미지

그냥 스레드 내부의 println이 메인 스레드의 println보다 늦게 실행된 듯 합니다.

a.wait()는 a가 종료될때까지 메인 스레드의 작동을 멈추게 해주는 메소드입니다.
그래서 a.start()가 아니고서야 run()을 가동할만한 라인이 없습니다.

즉 start()에서 run()은 제대로 실행됐지만
메인 스레드의 진행이 a보다 더 빨라서 waiting이 run보다 먼저 나온 것에 불과한 것 같습니다.
제대로 확인해보려면 메인 스레드의 println 위에 잠깐 sleep을 시켜보면 되겠죠.