日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在DelayQueue中更改延迟,从而更改顺序

發布時間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在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中更改延迟,从而更改顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。