Java 的TimeUnit
枚举可用于许多与时间相关的不同任务,而不仅仅是并发;和其他与时间相关的类Date
,如java.util
. 那么为什么是TimeUnit
会员java.util.concurrent
呢?
5 回答
可能是因为历史原因:
- 在过去的几年中,遗留的日期 API 并没有太大的发展
TimeUnit
广泛用于并发实用程序
有趣的是,Java 8 中的新日期 API 有一个类似于枚举的ChronoUnit
枚举TimeUnit
,但适用于日期和时间。特别是, aChronoUnit
可以转换为 a Duration
。
除了提供处理不同时间粒度的方法外,TimeUnit 还提供了线程感知方法,例如timedJoin:
public void timedJoin(Thread thread,
long timeout)
throws InterruptedException
我认为这个类的起源是为了帮助处理常见的并发编程任务,比如延迟执行。就目前而言,它有两个不同的功能(管理时间粒度;将时间概念应用于线程问题),这违反了单一责任原则。
鉴于 TimeUnit 在并发代码之外的实用性和流行性,一个更简洁的解决方案可能是java.util.TimeUnit
管理时间粒度的枚举和线程应用程序的单独java.util.concurrent
类。
TimeUnit
由并发专家组开发,主要用于并发实用程序。此类库通常使用java.
... 包之外的典型 3rd 方包开发,以允许使用现有 JVM 进行测试。后来它们通过重命名包来集成。所以这主要是历史原因。
我相信这更像是一个设计决定。他们在需要并发时添加它。因此,他们把它放在并发包下。是的,即使不涉及并发,我们也可以使用它。但它在并发应用程序中是必需的。好吧,我可能是错的。
“ TimeUnit表示给定粒度单位的持续时间,并提供实用方法来跨单位转换,并在这些单位中执行计时和延迟操作。”
我猜这是因为他们想为并发编写直观的代码。TimeUnit
JavaDoc 说:
TimeUnit 主要用于通知基于时间的方法应如何解释给定的计时参数。例如,如果锁不可用,以下代码将在 50 毫秒后超时:
Lock lock = ...; if (lock.tryLock(50L, TimeUnit.MILLISECONDS)) ...
所以,我猜他们正在编写 Lock 类,并且想要一种指定时间的方式。出于这个原因,他们创建了一个辅助类TimeUnit
,该类最初仅用于他们的锁码和朋友。随着时间的推移,它可能会被滥用于一般用途。
JavaDocjava.util.concurrent
说:
实用程序类在并发编程中通常很有用。