16

Java 的TimeUnit枚举可用于许多与时间相关的不同任务,而不仅仅是并发;和其他与时间相关的类Date,如java.util. 那么为什么是TimeUnit会员java.util.concurrent呢?

4

5 回答 5

5

可能是因为历史原因:

  • 在过去的几年中,遗留的日期 API 并没有太大的发展
  • TimeUnit广泛用于并发实用程序

有趣的是,Java 8 中的新日期 API 有一个类似于枚举的ChronoUnit枚举TimeUnit,但适用于日期和时间。特别是, aChronoUnit可以转换为 a Duration

于 2013-10-21T21:48:35.793 回答
3

除了提供处理不同时间粒度的方法外,TimeUnit 还提供了线程感知方法,例如timedJoin

public void timedJoin(Thread thread, long timeout) throws InterruptedException

我认为这个类的起源是为了帮助处理常见的并发编程任务,比如延迟执行。就目前而言,它有两个不同的功能(管理时间粒度;将时间概念应用于线程问题),这违反了单一责任原则

鉴于 TimeUnit 在并发代码之外的实用性和流行性,一个更简洁的解决方案可能是java.util.TimeUnit管理时间粒度的枚举和线程应用程序的单独java.util.concurrent类。

于 2013-10-21T21:31:55.760 回答
2

TimeUnit由并发专家组开发,主要用于并发实用程序。此类库通常使用java.... 包之外的典型 3rd 方包开发,以允许使用现有 JVM 进行测试。后来它们通过重命名包来集成。所以这主要是历史原因。

于 2013-10-21T21:22:34.137 回答
0

我相信这更像是一个设计决定。他们在需要并发时添加它。因此,他们把它放在并发包下。是的,即使不涉及并发,我们也可以使用它。但它在并发应用程序中是必需的。好吧,我可能是错的。

TimeUnit表示给定粒度单位的持续时间,并提供实用方法来跨单位转换,并在这些单位中执行计时和延迟操作。”

于 2013-10-21T21:20:42.047 回答
0

我猜这是因为他们想为并发编写直观的代码。TimeUnitJavaDoc 说:

TimeUnit 主要用于通知基于时间的方法应如何解释给定的计时参数。例如,如果锁不可用,以下代码将在 50 毫秒后超时:

   Lock lock = ...;
   if (lock.tryLock(50L, TimeUnit.MILLISECONDS)) ...

所以,我猜他们正在编写 Lock 类,并且想要一种指定时间的方式。出于这个原因,他们创建了一个辅助类TimeUnit,该类最初仅用于他们的锁码和朋友。随着时间的推移,它可能会被滥用于一般用途。

JavaDocjava.util.concurrent说:

实用程序类在并发编程中通常很有用。

于 2013-10-21T21:22:07.400 回答