Java: LockSupport.parkNanos vs Thread.sleep(...)
В некоторых случаях большинство из нас пишут такие вещи:
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
; // do nothing
}
Правильно или неправильно, допустимо только в некоторых тестовых жгутах, не моя точка зрения.
Я хочу сказать, что один и тот же код можно было бы написать более кратко:
LockSupport.parkNanos(2000* 1000000);
Есть ли какая-то причина, почему я должен поддерживать один подход над другим.
Ответы
Ответ 1
Документы для метода parkNanos
предоставляют условия, в которых метод может вернуться. Одним из таких условий является: вызов ложно (то есть без причины) возвращается. Поэтому в основном это нормально использовать, если вы не возражаете против ложных пробуждений и некоторых других потоков, "разглаживающих" ожидающий поток. И, конечно, комментарий Джона в значительной степени прибивает аргументы в пользу предпочтения друг другу.
Ответ 2
Читаемость: Thread.sleep
имеет довольно интуитивное значение. Как бы вы описали (другому разработчику) использование LockSupport.parkNanos
? Если это описание в основном состоит из "Я хочу, чтобы текущий поток был сон", то, безусловно, Thread.sleep
более описательный.
Краткость возникает из-за отсутствия обработки прерываний - поэтому создайте метод-обертка, чтобы сделать это, если хотите, который распространяет исключение как RuntimeException
. Heck, если вы создаете метод обертки, вы можете использовать любую реализацию, хотя другой поток мог бы, конечно, разгладить ваш "спальный" поток так же, как он мог бы прервать его...
Ответ 3
LockSupport имеет гораздо более ограниченное приложение и не поддерживает обработку исключений. Если вам нужно только заблокировать один поток, все в порядке.
Из API:
эти методы предназначены для использования в качестве инструментов для создания утилит синхронизации более высокого уровня и сами по себе не являются полезно для большинства приложений управления concurrency.