Thread.yield 원리 분석

Thread.yield()방법의 역할 은 현재 스 레 드 가 CPU 에 대한 점용 권 을 잠시 포기 하고 다른 스 레 드 에 양보 하 는 것 입 니 다.그 는 어떻게 실현 되 었 습 니까?yield 소스 코드 를 보면 로 컬 방법 임 을 알 수 있 습 니 다.JVM 에서 소스 코드 를 찾 으 면 다음 과 같 습 니 다.
JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass))
  JVMWrapper("JVM_Yield");
  //            Yield,   false
  if (os::dont_yield()) return;
  HOTSPOT_THREAD_YIELD();

  // When ConvertYieldToSleep is off (default), this matches the classic VM use of yield.
  // Critical for similar threading behaviour
  //  ,      ,        Yield     Sleep  (   false),     ,        sleep  ,     ,        naked_yield  。
  if (ConvertYieldToSleep) {
     
    os::sleep(thread, MinSleepInterval, false);
  } else {
     
    os::naked_yield();
  }
JVM_END

원본 코드 에서 볼 수 있 듯 이 yield 의 실현 은 두 가지 로 나 뉜 다.Yield 작업 을 Sleep 작업 으로 전환 할 수 있다 면(기본 값 은 false)운영 체제 의 sleep 방법 을 호출 하고 허용 되 지 않 으 면 운영 체제 의 naked 를 호출 한다.yield 방법.
만약 에 Sleep 방법 을 사용한다 면 이것 은 우리 가 모두 잘 알 고 있 습 니 다.그것 은 바로 현재 스 레 드 를 한 동안 수면 시 켜 CPU 의 점유 효 과 를 실현 하 는 것 입 니 다.여기 서 수면 시간 은 최소 수면 간격 으로 1MS 입 니 다.
naked 호출 이 라면yield,naked_yield 방법 은 Liux 에서 다음 과 같 습 니 다.
void os::naked_yield() {
     
  sched_yield();
}

그 중 schedyield 는 운영 체제 의 스 레 드 스케줄 링 방법 입 니 다.
그럼 sleep 와 schedyield 는 도대체 어떤 차이 가 있 습 니까?sleep:현재 스 레 드 를 잠 들 게 하고 수면 기간 에 CPU 의 점유 권 을 방출 합 니 다.시간 이 되면 다시 CPU 를 차지 합 니 다.sched_yield:현재 스 레 드 에 CPU 점유 권 을 양보 한 다음 에 스 레 드 를 같은 우선 순위 대기 열의 끝 에 추가 한 다음 에 다른 단계 가 현재 스 레 드 보다 같 거나 높 은 스 레 드 를 먼저 실행 합 니 다.조건 에 맞 는 스 레 드 가 없 으 면 이 함 수 는 즉시 돌아 와 현재 스 레 드 프로그램 을 계속 실행 합 니 다.따라서 sleep 는 현재 스 레 드 의 CPU 점용 권 을 반드시 방출 합 니 다.그리고 schedyield,다른 스 레 드 의 우선 순위 가 현재 스 레 드 와 같 거나 높 은 경우 에 만 CPU 점유 권 을 양보 합 니 다.

좋은 웹페이지 즐겨찾기