Действительно ли операторы Thread.sleep (0) и Thread.yield () эквивалентны?

Это должно помочь вам начать:

  Dim db As DAO.Database
  Dim qdf As DAO.QueryDef

  Set db = CurrentDB()
  For Each qdf In db.QueryDefs
    Debug.Print qdf.SQL
  Next qdf
  Set qdf = Nothing
  Set db = Nothing

Вы можете использовать объект файловой системы или встроенные функции ввода-вывода файлов VBA для записи SQL в файл. Я предполагаю, что вы спрашивали больше о том, как получить SQL, чем о том, как записать файл, но если вам это нужно, скажите это в комментарии, и я отредактирую сообщение (или кто-то опубликует свой ответ с инструкции для этого).

63
задан Joachim Sauer 21 October 2009 в 12:48
поделиться

5 ответов

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

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

44
ответ дан 24 November 2019 в 16:15
поделиться

This really depends on the platform and version of the JVM. For example, under Windows in JDK 5 (Hotspot), yield() is literally implemented as Sleep(0)-- although a sleep of 0 is treated slightly specially by Windows as I recall. But in JDK 6, yield() is implemented as SwitchToThread().

I put together some information a while ago on Thread.yield(), including some implementational details that may be of interest. (You might also want to see the stuff on Thread.sleep() I put together on the same site.)

30
ответ дан 24 November 2019 в 16:15
поделиться

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

32
ответ дан 24 November 2019 в 16:15
поделиться

yield () сообщает планировщику потоков JVM что нормально давать другие темы временные отрезки. Обычно JVM использует это вызов для активации другого потока тот же приоритет потока. В хорошем вытесняющая многопоточная среда, yield () не работает. Однако это важно в кооперативе многопоточная среда, поскольку без yield () один поток может съесть всего ЦП.

sleep (x) сообщает потоку JVM Планировщик для активного размещения этой темы спать и не запускать его снова, пока прошло минимум x миллисекунд.

Ни sleep (), ни yield () не изменяются что-нибудь о статусе блокировки синхронизации. Если ваша ветка есть блокировка, и вы вызываете sleep (1000), то пройдет как минимум секунда до того, как проснется ваша нить. Когда это просыпается, он может решить выпустить замок - или он может держаться за него длиннее.

ИСТОЧНИК: http://www.jguru.com/faq/view.jsp?EID=425624

10
ответ дан 24 November 2019 в 16:15
поделиться

Thread.Yield может передать ресурсы ЦП потокам с более низким приоритетом, а Thread.Sleep (0 ) передает ЦП только потокам с равным или более высоким приоритетом.

По крайней мере, на платформе Windows :)

1
ответ дан 24 November 2019 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: