작성
·
139
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
이런 식으로 출력이 되는데 코드에 어떤 문제가 있는 건가요?? Start 작업 시작 작업 시작 End 작업 완료 작업 완료 이런 식으로 출력 값이 떠야 하는데 어떤 문제가 있는 건가요?
답변 2
1
멀티스레드는 작업의 순서를 보장하지 않는다.
lgh8079님과 같이 출력된 이유를 굳이 생각해보자면 다음과 같은 시나리오로 유추할 수 있습니다.
thread1.start()를 호출
-> 작업1) 객체로만 존재하던 thread1에게 실제로 물리적인 스택 공간을 할당하는 작업, 대기 큐에 넣는 작업 등을 수행.
-> 작업2) 위 작업 등을 모두 수행하면 그제서야 run() 메서드를 호출 => "작업 시작"이 출력
따라서 thread1.start()를 호출함으로 인해 작업1)이 수행되는 동안에 main 스레드는 다음 스택 프레임인 log("End")를 수행하고/완료합니다.
// ㄴ 콘솔에 [ main] End 출력
그 뒤에야 thread1의 작업1)이 완료되고, thread의 작업2)를 수행하게 됩니다.
// ㄴ 콘솔에 [ thread-1] 작업 시작 출력
다시 정리해서 말하자면, thread1.start()
를 호출한다고 해서 thread1
이 곧바로 run()
을 호출하는 것이 아니고, thread1
에 물리적 스택 메모리를 할당하는 등의 사전 작업이 선행되어야 하고 그 동안 main
스레드는 이와 무관하게 본인의 할 일(log("End")
호출)을 계속 수행하기 때문에 화면과 같이 출력된 것이라고 유추할 수 있습니다.
또한 멀티 스레드는 작업 순서를 보장하기 않기 때문에, 경우에 따라서는
thread1
을 위한 사전 작업(메모리 할당 등)과run()
메서드 호출의 우선순위가 이전보다 높게 책정되거나 컴퓨터 성능 차이에 의해 매우 빠르게 수행되거나 하는 시나리오 하에서는main
스레드가log("End")
를 호출하기 전에thread1
의 작업이 먼저 수행되어 다음과 같이 출력될 수도 있습니다.