인프런 커뮤니티 질문&답변

코끼리님의 프로필 이미지
코끼리

작성한 질문수

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

프린터 예제4 - yield 도입

Yield 를 사용한 후 currentThread

해결된 질문

작성

·

76

2

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (/아니오)

[질문 내용]
안녕하세요.

public void run() {
  while (!Thread.interrupted()) {
	if (jobQueue.isEmpty()) {
		Thread.yield(); 
		continue;
	}
	...
}

위에 코드에서 Yield 를 사용하면 그 쓰레드가 양보를 해서 다시 스케쥴러로 들어간다고 하셨는데, 그러면 Thread.yield(); 가 실행이 된 후에, 다시 CPU 가 이 쓰레드를 실행시키기 전까지 그 다음 줄의 continue 코드는 실행되지 않고 멈춰있는 상태라고 생각하면 될까요? 그렇다면 쓰레드는 CPU 가 다시 실행시킬 시점에 몇번째 라인까지 실행을 했는지 기억하고 있다가 CPU 에게 알려주는 건가요?

감사합니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 코끼리님.

스레드의 Thread.yield() 메서드에 대한 질문에 대해 답변 드리겠습니다.

Thread.yield() 메서드는 현재 실행 중인 스레드가 자신에게 할당된 CPU 시간을 다른 스레드에게 양보하도록 합니다. 이 메서드가 호출되면 현재 스레드는 CPU 사용을 포기하고 스케줄러에 의해 다시 스케줄링되도록 대기 상태에 들어갑니다.

말씀하신 것처럼 Thread.yield()가 실행된 후, 해당 스레드는 실제로 CPU가 다시 스레드를 실행시킬 때까지 멈춰 있습니다. 그 다음 줄의 continue 코드가 실행되지 않고 대기 상태에 들어가며, CPU가 스레드를 다시 실행할 때까지 기다립니다.

CPU가 해당 스레드를 다시 실행할 때는 마지막에 실행된 코드 위치(즉, Thread.yield() 호출 뒤)에서 실행을 재개합니다. 이는 스레드가 실행 중이던 컨텍스트(context)를 저장하고 있었다가 재개 시 해당 컨텍스트를 복원하는 방식으로 이루어집니다. 따라서 스레드는 자신이 마지막으로 어느 위치를 실행했는지 알고 있으며, 그 지점부터 다시 실행을 시작합니다.

관련 질문 URL

  • main에서 start 호출 시
    • 이 게시물에서는 메인 스레드가 다른 스레드를 시작(start())할 때의 스택 프레임 구조와 동작을 설명하고 있습니다. 메서드 호출 후에 스레드가 어떻게 동작하는지에 대한 설명이 포함되어 있어 참고할 가치가 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

코끼리님의 프로필 이미지
코끼리

작성한 질문수

질문하기