Java TimeUnit
enum полезен для многих разных задач, связанных со временем, а не только concurrency; и другие связанные с временем классы, такие как Date
, являются частью java.util
. Итак, почему TimeUnit
член java.util.concurrent
?
Почему TimeUnit является членом java.util.concurrent?
Ответ 1
Помимо предоставления методов для работы с различными деталями времени, TimeUnit предоставляет методы, ориентированные на поток, такие как timedJoin:
public void timedJoin(Thread thread,
long timeout)
throws InterruptedException
Я думаю, что этот класс возник из-за общих задач параллельного программирования, таких как замедленное выполнение. В его нынешнем виде он имеет две различные функции (управляет временными деталями, применяет временные концепции к проблемам с потоками), что нарушает принцип единой ответственности.
Учитывая полезность и популярность TimeUnit за пределами параллельного кода, более быстрое решение может быть перечислением java.util.TimeUnit
для управления временными деталями и отдельным классом java.util.concurrent
для своих приложений при потоковой передаче.
Ответ 2
Вероятно, это связано с историческими причинами:
- API устаревших дат за последние несколько лет значительно не изменился.
-
TimeUnit
широко используется в утилитах concurrency
Интересно, что API новой даты в Java 8 имеет ChronoUnit
enum, который похож на перечисление TimeUnit
, но применяется к даты и время. В частности, a ChronoUnit
можно преобразовать в Duration
.
Ответ 3
TimeUnit
был разработан группой экспертов Concurrency для служебных программ Concurrency в первую очередь. Такие библиотеки часто разрабатываются с использованием типичного стороннего пакета вне пакетов java.
..., позволяющих тестировать существующие JVM. Позже они интегрируются путем переименования пакетов. Так что это историческая причина, в основном.
Ответ 4
Я считаю, что это скорее дизайнерское решение. Они добавили его, когда они нуждались в нем для concurrency. Следовательно, они помещают его в параллельный пакет. Да, мы можем использовать его, даже если concurrency не задействован. Но это было необходимость в параллельных приложениях. Ну, я могу ошибаться.
"A TimeUnit представляет продолжительность времени в заданной единице детализации и предоставляет методы утилиты для преобразования между единицами, а - выполнять операции синхронизации и задержки в этих устройствах.
Ответ 5
Я думаю, это потому, что они хотели написать интуитивно понятный код для concurrency. TimeUnit
JavaDoc говорит:
TimeUnit в основном используется для информирования временных методов о том, как следует интерпретировать заданный параметр времени. Например, следующий код будет отключен через 50 миллисекунд, если блокировка недоступна:
Lock lock = ...; if (lock.tryLock(50L, TimeUnit.MILLISECONDS)) ...
Итак, я предполагаю, что они пишут класс Lock, и хотел, чтобы такой способ указывал время. По этой причине они создали вспомогательный класс TimeUnit
, который изначально предназначался только для их кода блокировки и друзей. Со временем он, вероятно, подвергся насилию в общих целях.
JavaDoc для java.util.concurrent
говорит:
Утилиты, обычно используемые при параллельном программировании.