2016-08-14 124 views
0

我將在模擬停車場的程序中使用集合界面中的DelayQueue。我想知道是否有多個方法調用到隊列中,而沒有元素已經過期,最後一個調用是否返回首先發出的元素,還是返回之前調用過的元素?DelayQueue多個撥打電話

+0

'take'會等待第一個過期的元素,然後返回它,你不能在同一個線程中等待多個'take'調用。如果您有多個接聽電話,則他們將按照到期順序返回元素, – mszymborski

+0

好的,是接收下一個元素的第一個還是最後一個接聽電話? –

+0

第一次調用將返回首先過期的元素。下一個,第二個,等等。 – mszymborski

回答

1

作爲每DelayQueue.take的Javadoc中:

獲取並移除此隊列的頭部,直到到期延遲的元素可以用此隊列如果必要 等待。

也就是說這樣的事情:

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]調用將阻塞5秒鐘當前線程,然後返回第二個插入的元素。 [2]將阻止當前線程55s,然後返回第一個插入的元素。呼叫將阻塞4分鐘,最終返回最後插入的元素。

如果你想使用DelayQueue在多線程環境中,請注意,它不能保證公平性(這將是公平的,如果調用take線程會以相同的順序來擔任他們叫take) - 這是實現相關的,而在OpenJDK 7和8中,它並沒有使用公平的鎖來實現 - 所以線程的服務順序是任意的。