繁体   English   中英

为什么TimeUnit是java.util.concurrent的成员?

[英]Why is TimeUnit a member of java.util.concurrent?

Java的TimeUnit枚举对许多与时间相关的不同任务非常有用,而不仅仅是并发; Date等其他与时间相关的类是java.util一部分。 那么为什么TimeUnitjava.util.concurrent的成员呢?

这可能是出于历史原因:

  • 遗留日期API在过去几年中没有太大变化
  • 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM