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