Реализация DelayQueue в Java

#java #multithreading #concurrency

#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

разница содержит разницу в миллисекундах, и она выводится в консоли скриншота ниже. Пробовал использовать метод преобразования Timeunit, а также напечатанный в консоли ниже, которые точно такие же и имеют длинный тип данных. Когда оба значения одинаковы и имеют длинный тип данных, зачем мне нужно использовать эту дополнительную строку

 unit.convert(diff, TimeUnit.MILLISECONDS);
 

вместо этого я мог бы также вернуть diff напрямую, не используя метод convert .

Скриншот консоли

Комментарии:

1. Вы конвертируете из миллисекунд, а не в миллисекунды.

Ответ №1:

unit предоставляется вызывающим абонентом getDelay() . Реализация должна возвращать задержку в единицу времени , указанную unit .

Поэтому unit.convert(diff, TimeUnit.MILLISECONDS) преобразует diff , который выражается в TimeUnit.MILLISECONDS , в unit .

TimeUnit.MILLISECONDS относится к тому, что diff есть. diff затем преобразуется из TimeUnit.MILLISECONDS в unit .

Обратите внимание, что вы также должны реализовать compareTo() of Comparable , который Delayed расширяется.


unit Параметр не является фиксированным. Он предоставляется вызывающей стороной метода, поэтому он может отличаться. Это может быть TimeUnit.MILLISECONDS или TimeUnit.SECONDS или любое другое значение enum. Вот почему вам нужно использовать этот convert метод.

Комментарии:

1. Спасибо за ответ. Когда разница преобразуется в единицу измерения. Не могли бы вы , пожалуйста , объяснить , к чему именно относится эта единица измерения ? метод преобразования здесь преобразует разницу (длиной в миллисекундах) в (длиной в ЕДИНИЦАХ измерения) В чем разница между миллисекундами и единицей измерения здесь

2. @Rakesh unit — это параметр метода. Это тип TimeUnit , который является перечислением. Посмотрите на него, чтобы увидеть все возможные значения (миллисекунды, секунды, минуты и т.д.).