0
我將在模擬停車場的程序中使用集合界面中的DelayQueue。我想知道是否有多個方法調用到隊列中,而沒有元素已經過期,最後一個調用是否返回首先發出的元素,還是返回之前調用過的元素?DelayQueue多個撥打電話
我將在模擬停車場的程序中使用集合界面中的DelayQueue。我想知道是否有多個方法調用到隊列中,而沒有元素已經過期,最後一個調用是否返回首先發出的元素,還是返回之前調用過的元素?DelayQueue多個撥打電話
作爲每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中,它並沒有使用公平的鎖來實現 - 所以線程的服務順序是任意的。
'take'會等待第一個過期的元素,然後返回它,你不能在同一個線程中等待多個'take'調用。如果您有多個接聽電話,則他們將按照到期順序返回元素, – mszymborski
好的,是接收下一個元素的第一個還是最後一個接聽電話? –
第一次調用將返回首先過期的元素。下一個,第二個,等等。 – mszymborski