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