delayqueue_在DelayQueue中更改延迟,从而更改顺序
生活随笔
收集整理的這篇文章主要介紹了
delayqueue_在DelayQueue中更改延迟,从而更改顺序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
delayqueue
因此,我正在考慮構建一個簡單的對象緩存,該緩存在給定時間后會使對象過期。 顯而易見的機制是使用Java并發包中的DelayedQueue類。 但是我想知道是否有可能在將對象添加到隊列后更新延遲。 看一下Delayed接口,似乎沒有充分的理由不在文檔中,所以我認為是時候進行實驗了。因此,首先您需要創建一個Delayed實例,這是一個非常簡單的實現,通過切換標志,您基本上可以反轉列表中的超時順序。 (并添加適當的偏移量,以便按正確的順序進行操作
static int COUNT=100;class DelayedSwap implements Delayed, Comparable<Delayed> {int index = 0;volatile boolean swap = false;long starttime;public DelayedSwap(int index, long starttime) {super();this.index = index;this.starttime = starttime;}private long getDelay() {return (swap ? starttime + (2*COUNT - index) * 100 :starttime + index * 100) - System.currentTimeMillis();}public String toString(){return index + ' swapped ' + swap + ' delay ' + getDelay();}@Overridepublic long getDelay(TimeUnit unit) {return unit.convert(getDelay(), TimeUnit.MILLISECONDS);}@Overridepublic int compareTo(Delayed delayed) {if (delayed == this)return 0;return (int)(getDelay(TimeUnit.MILLISECONDS) - delayed.getDelay(TimeUnit.MILLISECONDS));}}因此,為了測試這一點,我創建了一個方法,該方法將創建一堆DelayedSwap對象,并在處理列表的一半過程中切換標志,從而更改到期順序。
public static void main(String[] args) throws InterruptedException {long start = System.currentTimeMillis();final Listdelayed = new ArrayList();for (int i = 1; i < COUNT; i++) {delayed.add(new DelayedSwap(i, start));}final DelayQueue dq = new DelayQueue();dq.addAll(delayed);new Thread(new Runnable() {@Overridepublic void run() {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {}for (DelayedSwap d : delayed) {d.swap = true;}}}).start();while (!dq.isEmpty()) {System.out.println(dq.take());}}因此,我期望的是按正確的順序寫出元素1-50,但是在交換元素之后,它們以任意順序出現,與請求延遲時間相去甚遠。
1 swapped false delay -19 2 swapped false delay -4 3 swapped false delay -4 4 swapped false delay -4 5 swapped false delay -4 6 swapped false delay -4 7 swapped false delay -4 8 swapped false delay -4 9 swapped false delay -4 10 swapped false delay -4 11 swapped false delay -4 12 swapped false delay -4 13 swapped false delay -4 14 swapped false delay -4 15 swapped false delay -4 16 swapped false delay -4 17 swapped false delay -4 18 swapped false delay -4 19 swapped false delay -4 20 swapped false delay -4 21 swapped false delay -4 22 swapped false delay -4 23 swapped false delay -4 24 swapped false delay -4 25 swapped false delay -4 26 swapped false delay -4 27 swapped false delay -4 28 swapped false delay -4 29 swapped false delay -4 30 swapped false delay -4 31 swapped false delay -4 32 swapped false delay -4 33 swapped false delay -4 34 swapped false delay -4 35 swapped false delay -4 36 swapped false delay -4 37 swapped false delay -4 38 swapped false delay -4 39 swapped false delay -5 40 swapped false delay -4 41 swapped false delay -4 42 swapped false delay -5 43 swapped false delay -4 44 swapped false delay -5 45 swapped false delay -5 46 swapped false delay -5 47 swapped false delay -5 48 swapped false delay -5 49 swapped false delay -5 50 swapped false delay -5 51 swapped true delay -6 94 swapped true delay -4306 96 swapped true delay -4506 87 swapped true delay -3606 91 swapped true delay -4006 97 swapped true delay -4606 95 swapped true delay -4406 98 swapped true delay -4706 92 swapped true delay -4106 82 swapped true delay -3106 80 swapped true delay -2906 90 swapped true delay -3906 93 swapped true delay -4206 74 swapped true delay -2306 99 swapped true delay -4806 70 swapped true delay -1906 69 swapped true delay -1806 66 swapped true delay -1506 83 swapped true delay -3206 62 swapped true delay -1107 61 swapped true delay -1007 58 swapped true delay -707 71 swapped true delay -2007 89 swapped true delay -3807 85 swapped true delay -3407 78 swapped true delay -2707 86 swapped true delay -3507 81 swapped true delay -3007 88 swapped true delay -3707 84 swapped true delay -3307 79 swapped true delay -2807 76 swapped true delay -2507 72 swapped true delay -2107 68 swapped true delay -1707 65 swapped true delay -1407 60 swapped true delay -907 57 swapped true delay -608 55 swapped true delay -408 75 swapped true delay -2408 77 swapped true delay -2608 73 swapped true delay -2208 63 swapped true delay -1208 67 swapped true delay -1608 64 swapped true delay -1308 59 swapped true delay -808 56 swapped true delay -508 54 swapped true delay -308 53 swapped true delay -208 52 swapped true delay -108 Process exited with exit code 0.因此,訣竅是,當您知道要修改時,請先刪除延遲,然后再將元素重新添加到隊列中。
// Replacement swap loopfor (DelayedSwap d : delayed) {if (dq.remove(d)){d.swap = true;dq.add(d);}}此運行產生了一組更合理的結果:
1 swapped false delay -4 2 swapped false delay -8 3 swapped false delay -14 4 swapped false delay -8 5 swapped false delay -4 6 swapped false delay -4 7 swapped false delay -4 8 swapped false delay -4 9 swapped false delay -4 10 swapped false delay -4 11 swapped false delay -4 12 swapped false delay -4 13 swapped false delay -4 14 swapped false delay -4 15 swapped false delay -4 16 swapped false delay -4 17 swapped false delay -4 18 swapped false delay -8 19 swapped false delay -4 20 swapped false delay -4 21 swapped false delay -4 22 swapped false delay -4 23 swapped false delay -4 24 swapped false delay -4 25 swapped false delay -4 26 swapped false delay -4 27 swapped false delay -4 28 swapped false delay -4 29 swapped false delay -4 30 swapped false delay -4 31 swapped false delay -4 32 swapped false delay -4 33 swapped false delay -4 34 swapped false delay -4 35 swapped false delay -4 36 swapped false delay -4 37 swapped false delay -4 38 swapped false delay -4 39 swapped false delay -5 40 swapped false delay -5 41 swapped false delay -5 42 swapped false delay -4 43 swapped false delay -4 44 swapped false delay -5 45 swapped false delay -5 46 swapped false delay -5 47 swapped false delay -5 48 swapped false delay -5 49 swapped false delay -5 50 swapped false delay -5 99 swapped true delay -5 98 swapped true delay -5 97 swapped true delay -11 96 swapped true delay -1 95 swapped true delay -5 94 swapped true delay -9 93 swapped true delay -5 92 swapped true delay -5 91 swapped true delay -5 90 swapped true delay -5 89 swapped true delay -5 88 swapped true delay -5 87 swapped true delay -5 86 swapped true delay -5 85 swapped true delay -5 84 swapped true delay -5 83 swapped true delay -5 82 swapped true delay -5 81 swapped true delay -5 80 swapped true delay -5 79 swapped true delay -5 78 swapped true delay -5 77 swapped true delay -5 76 swapped true delay -5 75 swapped true delay -5 74 swapped true delay -5 73 swapped true delay -5 72 swapped true delay -6 71 swapped true delay -5 70 swapped true delay -5 69 swapped true delay -5 68 swapped true delay -5 67 swapped true delay -5 66 swapped true delay -5 65 swapped true delay -5 64 swapped true delay -5 63 swapped true delay -6 62 swapped true delay -5 61 swapped true delay -6 60 swapped true delay -6 59 swapped true delay -6 58 swapped true delay -6 57 swapped true delay -6 56 swapped true delay -6 55 swapped true delay -6 54 swapped true delay -6 53 swapped true delay -6 52 swapped true delay -6 51 swapped true delay -6 Process exited with exit code 0.我不認為這是對象本身的錯誤,因為您不希望在鍵更改時HashTable可以命令它的自身,但是我對此行為感到有些驚訝。
祝您編程愉快,別忘了分享!
參考:在Gerard Davison博客博客中,我們的JCG合作伙伴 Gerard Davison在DelayQueue中更改了延遲,從而更改了順序 。
翻譯自: https://www.javacodegeeks.com/2012/09/changing-delay-and-hence-order-in.html
delayqueue
總結
以上是生活随笔為你收集整理的delayqueue_在DelayQueue中更改延迟,从而更改顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 免费的Linux服务器(免费的linux
- 下一篇: 备案注销(注销公司备案)