Использует ли java Thread таймер реального времени в системе или имеет собственный выделенный таймер? - PullRequest
4 голосов
/ 21 января 2011

Кто-нибудь знает, какой таймер использует метод Thread.sleep(1000)?Использует ли Thread системный таймер реального времени или имеет собственный выделенный таймер?

Заранее спасибо за ответы.

Ответы [ 3 ]

5 голосов
/ 21 января 2011

Спецификация языка Java переносит детали семантики этого метода в базовую систему. Таким образом, поведение будет зависеть от того, какую реализацию JVM, какой rt.jar вы используете, а также, предположительно, от операционной системы и оборудования, на котором работает приложение.

Это все, что сказано о методе в JLS (Глава 17: Потоки и блокировки):

17,9 Сон и урожайность

Thread.sleep приводит к тому, что текущий исполняемый поток находится в спящем режиме (временно прекращает выполнение) в течение указанной продолжительности, в зависимости от точности и точности системных таймеров и планировщиков . Поток не теряет права собственности ни на какие мониторы, и возобновление выполнения будет зависеть от планирования и доступности процессоров, на которых будет выполняться поток.

Ни сон в течение периода нулевого времени, ни операция выхода не должны иметь наблюдаемых эффектов.

Важно отметить, что ни Thread.sleep, ни Thread.yield не имеют семантики синхронизации. В частности, компилятору не нужно сбрасывать записи, кэшированные в регистрах, в общую память перед вызовом Thread.sleep или Thread.yield, а также компилятору не нужно повторно загружать значения, кэшированные в регистрах, после вызова Thread.sleep или Thread. .yield.

4 голосов
/ 21 января 2011

Thread.sleep(long) - нативный метод.Как это работает, зависит от реализации ОС и JVM.

Вы можете взглянуть на собственный источник в jvm.cpp [openjdk.java.net] :

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

  if (millis < 0) {
    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");
  }

  if (Thread::is_interrupted (THREAD, true) && !HAS_PENDING_EXCEPTION) {
    THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
  }

  // Save current thread state and restore it at the end of this block.
  // And set new thread state to SLEEPING.
  JavaThreadSleepState jtss(thread);

  HS_DTRACE_PROBE1(hotspot, thread__sleep__begin, millis);

  if (millis == 0) {
    // When ConvertSleepToYield is on, this matches the classic VM implementation of
    // JVM_Sleep. Critical for similar threading behaviour (Win32)
    // It appears that in certain GUI contexts, it may be beneficial to do a short sleep
    // for SOLARIS
    if (ConvertSleepToYield) {
      os::yield();
    } else {
      ThreadState old_state = thread->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) {
        HS_DTRACE_PROBE1(hotspot, thread__sleep__end,1);
        // 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);
  }
  HS_DTRACE_PROBE1(hotspot, thread__sleep__end,0);
JVM_END

В приведенном выше коде он вызывает функцию sleep операционной системы.

2 голосов
/ 21 января 2011

С Javadoc

Заставляет текущий выполняющийся поток в спящий режим (временно прекращать выполнение) на указанное количество миллисекунд, при условии точности и точности системных таймеров и планировщиков . Поток не теряет права собственности ни на какие мониторы.

...