Java中的DelayQueue实现

4

我刚开始学习线程和并发包。了解到要使用 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方法并在下面的控制台中打印出来,这两个值完全相同且都属于长整型。当两个值都相同并且是长整型时,为什么我需要使用这个额外的行呢?

unit.convert(diff, TimeUnit.MILLISECONDS);

不过,我也可以直接返回差异而不使用转换方法。

控制台截图


1
你正在从毫秒进行转换,而不是转换至毫秒。 - Louis Wasserman
1个回答

3

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

因此,unit.convert(diff, TimeUnit.MILLISECONDS)将以TimeUnit.MILLISECONDS表示的diff转换为unit

TimeUnit.MILLISECONDS是指diff的单位。然后将diffTimeUnit.MILLISECONDS转换为unit

请注意,您还必须实现Delayed继承的ComparablecompareTo()方法。


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


谢谢你的回答。当diff被转换为unit时,你能否解释一下这个unit具体指的是什么?这里的convert方法将diff(以毫秒为单位的长整型)转换为(以UNIT为单位的长整型)。这里毫秒和UNIT之间有什么区别? - user12029024
@Rakesh unit 是方法参数。它的类型是 TimeUnit,这是一个枚举类型。查看它以查看所有可能的值(毫秒、秒、分钟等)。 - spongebob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接