与 java 中的延迟接口关联的 getDelay(TimeUnit)

getDelay(TimeUnit) associated with Delayed interface in java

要使用 DelayQueue,我们需要为 getDelay(TimeUnit unit)compareTo() 方法实现 Delayed 接口,根据我的理解,将在参数 TimeUnit 枚举不固定的情况下调用 getDelay 方法,它可能是 TimeUnit.MICROSECONDSTimeUnit.NANOSECONDSTimeUnit.SECONDS 等。例如,如果使用 unit.convert(long,TimeUnit.MICROSECONDS),我们要求将 MICROSECONDS 格式的 long 变量转换为一个由 getDelay 的调用者指定。

我在下面的实现中使用了 unit.name() 但每次我只看到它打印 TimeUnit.NANOSECONDS 为什么它只打印 NANOSECONDS。它可以是任何东西。我一直在测试代码以查看差异近 7 个小时。谁能解释这种行为?

public long getDelay(TimeUnit unit){
    System.out.println("i'm calling "+unit.name());   // Always TimeUnit.NANOSECONDS
    long diff=millis-System.currentTimeMillis();
    return unit.convert(diff,TimeUnit.MILLISECONDS);  // Asking to convert to the one specified by the caller
}

一般来说,该接口可能就是这种情况,但似乎 class DelayQueue 只调用过 getDelay(TimeUnit.NANOSECONDS).

Class DelayQueue 表示

Expiration occurs when an element's getDelay(TimeUnit.NANOSECONDS) method returns a value less than or equal to zero.

所以它只会用 TimeUnit.NANOSECONDS.

调用是有道理的

其他 classes 可以使用其他参数调用该方法。其他版本的 DelayQueue 也可能使用其他参数调用该方法,但您可以验证 this openjdk8 implementation 不会。