Почему TimeUnit является членом java.util.concurrent?

Java TimeUnit enum полезен для многих разных задач, связанных со временем, а не только concurrency; и другие связанные с временем классы, такие как Date, являются частью java.util. Итак, почему 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 говорит:

Утилиты, обычно используемые при параллельном программировании.