Подтвердить что ты не робот

Java: LockSupport.parkNanos vs Thread.sleep(...)

В некоторых случаях большинство из нас пишут такие вещи:

try {
   Thread.sleep(2000); 
} catch (InterruptedException e) {
   ; // do nothing
}

Правильно или неправильно, допустимо только в некоторых тестовых жгутах, не моя точка зрения. Я хочу сказать, что один и тот же код можно было бы написать более кратко:

  LockSupport.parkNanos(2000* 1000000);

Есть ли какая-то причина, почему я должен поддерживать один подход над другим.

4b9b3361

Ответ 1

Документы для метода parkNanos предоставляют условия, в которых метод может вернуться. Одним из таких условий является: вызов ложно (то есть без причины) возвращается. Поэтому в основном это нормально использовать, если вы не возражаете против ложных пробуждений и некоторых других потоков, "разглаживающих" ожидающий поток. И, конечно, комментарий Джона в значительной степени прибивает аргументы в пользу предпочтения друг другу.

Ответ 2

Читаемость: Thread.sleep имеет довольно интуитивное значение. Как бы вы описали (другому разработчику) использование LockSupport.parkNanos? Если это описание в основном состоит из "Я хочу, чтобы текущий поток был сон", то, безусловно, Thread.sleep более описательный.

Краткость возникает из-за отсутствия обработки прерываний - поэтому создайте метод-обертка, чтобы сделать это, если хотите, который распространяет исключение как RuntimeException. Heck, если вы создаете метод обертки, вы можете использовать любую реализацию, хотя другой поток мог бы, конечно, разгладить ваш "спальный" поток так же, как он мог бы прервать его...

Ответ 3

LockSupport имеет гораздо более ограниченное приложение и не поддерживает обработку исключений. Если вам нужно только заблокировать один поток, все в порядке.

Из API:

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