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中更改延迟,从而更改顺序相关推荐

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

    因此,我正在研究构建一个简单的对象缓存,该缓存在给定时间后会使对象过期. 显而易见的机制是使用Java并发包中的DelayedQueue类. 但我想知道是否有可能在将对象添加到队列后更新延迟. 看一下 ...

  2. 怎样把做好的css样式改日期,Win8操作系统任务栏中日期样式怎么更改

    Win8操作系统任务栏中日期样式怎么更改 有些用户可能因为Win8系统的时钟与日期板式感到困惑,下面小编为大家带来一些办法,能帮大家改变Win8系统中的时钟与日期,使其变得更舒适,更多消息请关注应届毕 ...

  3. eclipse中svn和TortoiseSVN更改账号的方法

    eclipse中svn和TortoiseSVN更改账号的方法 eclipse中svn更改账号的方法: 在svn的界面中并没有为我们提供直接更换用户名密码的地方,所以一旦我们需要更换用户名的就需要自己想 ...

  4. QT使用html改变字体颜色,QT中设置字体和更改字体颜色

    QT中设置字体和更改字体颜色 对一个文本框lineEdit设置字体,首先我建了一个按钮setFontButton用来设置 并定义了它的相应函数setFont,将setFontButton添加到布局中, ...

  5. 如何在React中从其父组件更改子组件的状态

    by Johny Thomas 约翰尼·托马斯(Johny Thomas) 如何在React中从其父组件更改子组件的状态 (How to change the state of a child com ...

  6. sql文件中捕获异常_使用更改数据捕获监视SQL Server中的更改

    sql文件中捕获异常 背景 (Background) In multi-user environments, changes may occur frequently to the architect ...

  7. 微信小程序 data中数据值的更改与储存

    微信小程序 data中数据值的更改与储存 this.setData this.setData 直接更改 success(res){this.setData({list:res.data.data}) ...

  8. QT中设置字体和更改字体颜色

    QT中设置字体和更改字体颜色 对一个文本框lineEdit设置字体,首先我建了一个按钮setFontButton用来设置 并定义了它的相应函数setFont,将setFontButton添加到布局中, ...

  9. 怎样找回计算机以前用户界面,电脑中的窗口颜色更改后如何恢复到以前的状态?...

    在电脑中,当我们把它的性能设置做了一个更改之后,可以看到电脑中的窗口的颜色也都随之发生了变化.如果不喜欢这个颜色,那么电脑中的窗口颜色更改后如何恢复到以前的状态?下面小编就为大家介绍一下,以前来看看吧 ...

最新文章

  1. 照葫芦画瓢-python editors(编辑器 IDE)
  2. 在量子计算机到来之前,请准备好抗量子破解的密码学
  3. Understanding Design And Development Job Titles--reference
  4. pycharm的演示模式、无干扰模式、全屏模式(presentation mode、distraction free mode、full screen mode)
  5. 在windows上Matlab 编译MatConvNet
  6. Shell语法—— while 条件语句
  7. arial字体可以商用吗_【工作总结】莫让字体版权引火上身
  8. vue-cli webpack浅析
  9. 《数据库原理及应用》 课程设计
  10. les有学计算机的吗,拷问LES大涡模拟
  11. 通过java把cad的dwg文件转换为svg文件
  12. 微信公众号一次群发多个推文
  13. python去字符串空格函数汇总
  14. LLVM SSA 介绍
  15. IDEA全局配置图文教程
  16. 加拿大 oracle audio,来自加拿大的“简单”与“纯粹”——Verity Audio Otello座地式扬声器...
  17. 初等函数的麦克劳林级数展开+逆函数的展开求法
  18. python库——h5py读取h5文件
  19. android 电商app组件化,APICloud AVM多端开发案例深度解析(一)--生鲜电商app开发
  20. 像素 屏幕分辨率 摄像头分辨率

热门文章

  1. 装饰器模式和代理模式的区别
  2. 最全三大框架整合(使用映射)——数据库资源文件jdbc.properties
  3. ‘entityManagerFactory‘ that could not be found
  4. 强行覆盖远程的gitlab 出错
  5. linux下q和q 的区别,linux命令中q、wq、q!的区别
  6. java 内存快照怎么看_jvm内存快照dump文件太大,怎么分析
  7. MySQL导入冲突保留两者_面试被问MySQL 主从复制,怎么破?
  8. kafka消费者开发方式小结
  9. 基于springboot+vue的前后端分离商城系统
  10. finally块不被执行的情况总结