java中Thread.sleep()背后的逻辑是什么

java中Thread.sleep()背后的逻辑是什么,java,multithreading,Java,Multithreading,大家都知道,java中Thread.sleep背后的逻辑是什么。他们是否使用计时器?如果“逻辑”的意思是“Thread.sleep()如何在内部实现”,这是一种本机方法,这意味着它依赖于平台和JVM实现。我希望大多数实现依赖于底层操作系统提供的线程机制。如果“逻辑”的意思是“Thread.sleep()如何在内部实现”,那么它是一种本机方法,这意味着它依赖于平台和JVM实现。我希望大多数实现都依赖于底层操作系统提供的线程机制。线程.sleep()背后的“逻辑”将在操作系统内核或系统库中实现 因此

大家都知道,java中Thread.sleep背后的逻辑是什么。他们是否使用计时器?如果“逻辑”的意思是“Thread.sleep()如何在内部实现”,这是一种本机方法,这意味着它依赖于平台和JVM实现。我希望大多数实现依赖于底层操作系统提供的线程机制。

如果“逻辑”的意思是“Thread.sleep()如何在内部实现”,那么它是一种本机方法,这意味着它依赖于平台和JVM实现。我希望大多数实现都依赖于底层操作系统提供的线程机制。

线程.sleep()背后的“逻辑”将在操作系统内核或系统库中实现

因此,“逻辑”可能因操作系统而异。对于Linux、BSD或OpenSolaris等开放源代码操作系统,您可以深入研究操作系统源代码来了解这一点。对于封闭源操作系统,您可能需要求助于反向工程

无论哪种方式,实现“逻辑”(例如,它是否使用计时器)可能因操作系统而异,也因操作系统版本而异。

线程.sleep()背后的“逻辑”(您似乎在询问)将在操作系统内核或系统库中实现

因此,“逻辑”可能因操作系统而异。对于Linux、BSD或OpenSolaris等开放源代码操作系统,您可以深入研究操作系统源代码来了解这一点。对于封闭源操作系统,您可能需要求助于反向工程


无论哪种方式,实现“逻辑”(例如,是否使用计时器)可能因操作系统而异,也可能因操作系统版本而异。

您也可以在此处查看。对弗尔来说。7在jvm.cpp中有一些有趣的代码:



JVM_ENTRY(void, JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis))
  JVMWrapper("JVM_Sleep");


  if (millis osthread()->get_state();
      thread->osthread()->set_state(SLEEPING);
      os::sleep(thread, MinSleepInterval, false);
      thread->osthread()->set_state(old_state);
    }
  } else {
    ThreadState old_state = thread->osthread()->get_state();
    thread->osthread()->set_state(SLEEPING);
    if (os::sleep(thread, millis, true) == OS_INTRPT) {
      // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
      // us while we were sleeping. We do not overwrite those.
      if (!HAS_PENDING_EXCEPTION) {
        // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
        // to properly restore the thread state.  That's likely wrong.
        THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
      }
    }
    thread->osthread()->set_state(old_state);
  }
JVM_END


嗯,你也可以看看这里。对弗尔来说。7在jvm.cpp中有一些有趣的代码:



JVM_ENTRY(void, JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis))
  JVMWrapper("JVM_Sleep");


  if (millis osthread()->get_state();
      thread->osthread()->set_state(SLEEPING);
      os::sleep(thread, MinSleepInterval, false);
      thread->osthread()->set_state(old_state);
    }
  } else {
    ThreadState old_state = thread->osthread()->get_state();
    thread->osthread()->set_state(SLEEPING);
    if (os::sleep(thread, millis, true) == OS_INTRPT) {
      // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
      // us while we were sleeping. We do not overwrite those.
      if (!HAS_PENDING_EXCEPTION) {
        // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
        // to properly restore the thread state.  That's likely wrong.
        THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
      }
    }
    thread->osthread()->set_state(old_state);
  }
JVM_END


这是个问题吗?如果是,这意味着什么?这是一个问题吗?如果是,这意味着什么?