#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
, который является перечислением. Посмотрите на него, чтобы увидеть все возможные значения (миллисекунды, секунды, минуты и т.д.).