首页 > 解决方案 > Java中的延迟队列实现

问题描述

我是了解线程和并发包的初学者。明白要使用java.util.concurrent.DelayedQueue我们必须实现java.util.concurrent.Delayed接口,它有一个抽象方法 getDelay()

long getDelay(TimeUnit unit)

在给定的时间单位内返回与此对象关联的剩余延迟。

@Override
public long getDelay(TimeUnit unit) {
    long diff = startTime - System.currentTimeMillis();  // long variable
    return unit.convert(diff, TimeUnit.MILLISECONDS);   // Not clear about this part which also returns long
}

getDelay 所做的只是得到毫秒差异,我相信我们从上面的 diff 变量中得到,那么为什么我们需要使用 convert 方法?convert 方法说 diff 需要转换为毫秒(为什么它已经以毫秒为单位还需要转换)。如果我的理解没有错,TimeUnit 仅用于指定转换为毫秒。任何人都可以帮助我了解更多关于这个主题的信息。

编辑-1

diff 包含毫秒差异,并打印在下面的屏幕截图控制台中。尝试使用 Timeunit 的 convert 方法,并在下面的控制台中打印,它们完全相同并且是 long 数据类型。当两个值都相同且长数据类型时,为什么我需要使用这个额外的行

unit.convert(diff, TimeUnit.MILLISECONDS);

相反,我也可以不使用 convert 方法直接返回差异。

控制台截图

标签: javamultithreadingconcurrency

解决方案


unit由 的调用者提供getDelay()。实现必须以 指定的时间单位返回延迟unit

因此,unit.convert(diff, TimeUnit.MILLISECONDS)diff用 表示的转换TimeUnit.MILLISECONDSunit

TimeUnit.MILLISECONDS指的是什么diffdiff然后从 转换TimeUnit.MILLISECONDSunit

请注意,您还必须实现compareTo()of Comparable,它Delayed扩展。


unit参数不固定。它由方法的调用者提供,因此可能会有所不同。它可以是TimeUnit.MILLISECONDSTimeUnit.SECONDS任何其他枚举值。这就是您需要使用该convert方法的原因。


推荐阅读