2016-08-14 2 views
0

Я собираюсь использовать DelayQueue из интерфейса Collections в программе, имитирующей парковку. Мне было интересно, есть ли несколько вызовов метода вызова в очереди, в то время как ни один элемент не истек, последний вызов будет возвращать элемент, который выходит первым, или возвращает элемент, который появляется после предыдущего вызова?DelayQueue multiple take calls

+0

'take' будет ждать первого истекшего элемента и затем вернуть его, вы не можете иметь несколько вызовов' take', ожидающих в том же потоке. Если у вас несколько звонков один за другим, они возвращают элементы в порядке истечения срока действия, – mszymborski

+0

Хорошо, и это первый или последний вызов, который получает следующий элемент? –

+0

Первый вызов возвращает элемент, срок действия которого истек. следующий второй, и так далее. – mszymborski

ответ

1

Согласно Javadoc DelayQueue.take «s:

Извлекает и удаляет главу этой очереди, ожидая в случае необходимости пока элемент с истекшим сроком задержки не доступен на этой очереди.

Это что-то вроде этого:

DelayQueue<DelayedSomething> q = new DelayQueue<>(); 

q.offer(somethingExpiringIn60s); 
q.offer(somethingExpiringIn5s); 
q.offer(somethingExpiringIn5min); 

DelayedSomething shouldBeSomethingExpiringIn5s = q.take(); //[1] 
DelayedSomething shouldBeSomethingExpiringIn60s = q.take(); //[2] 
DelayedSomething shouldBeSomethingExpiringIn5min = q.take(); //[3] 

будет работать, как этого - [1] вызов будет блокировать текущий поток 5s, а затем вернуть второй вставленный элемент. [2] заблокирует текущий поток на 55 секунд, а затем вернет первый вставленный элемент. Звонок [3]take будет блокироваться в течение 4 минут, в конце концов возвращая последний вставленный элемент.

Если вы хотите использовать DelayQueue в многопоточной среде, пожалуйста, обратите внимание, что это не гарантирует справедливость (это было бы справедливо, если потоки, требующие take будут обслуживаться в том же порядке, как они называли take) - это зависит от реализации, и в OpenJDK 7 и 8 он не использует справедливые блокировки для реализации - поэтому порядок, в котором будут выполняться потоки, является произвольным.