3

所以现在我有一个存储日历对象的哈希图(只需要一种存储日期的方法)。每个值存储两个 Calendar 对象,一个表示事件的开始,另一个表示事件的结束。用户通过 gui 输入这些内容,它们可以跨越数周和数月。

我需要做的是能够在这些条目过期时删除它们,这意味着它们的第二个日历对象已经根据真实世界的日期过去了。只要实例正在运行,我希望它自动完成。

我的想法是运行一个计时器线程,每周一次,它可以遍历哈希图中的所有条目并删除已过期的条目。我知道它不是那么实用,它是一个学校项目。但我只是在寻找可以帮助以有效方式实现这一点的想法或设计模式。

谢谢,如果您需要更多信息,请告诉我。

4

5 回答 5

1

拥有一个执行维护任务的后台线程是一个好主意,并且是非常常见的做法。请注意,尽管 Hashmap 不是线程安全的,因此您需要同步其访问,或替换为 ConcurrentHashMap 等线程安全类。

于 2012-10-24T01:35:54.943 回答
1

也许这对: http ://code.google.com/p/guava-libraries/wiki/CachesExplained Guava 有一个“缓存”机制,可以处理超时,...

所以处理是为你做的,但要注意:后台没有运行线程。维护是在写入期间完成的。信息也包含在链接中。

番石榴解决方案以另一种方式“解释”。为什么不处理超时元素的列表/映射,它们会在访问期间告诉您它们超时或自行关闭。您不必从外部管理元素,它们可以自己处理超时。这种方式对用户来说通常非常简单和透明。

于 2012-10-24T04:15:18.330 回答
1

使用Calendar只会导致悲痛——这是一个糟糕的课程,充满了陷阱和错误。

相反,将 start 和 end 存储为long值,按照Date.getTime()并将它们与 进行比较System.currentTimeMillis(),以保持简洁明了。

于 2012-10-24T01:42:07.720 回答
0

另一个选项可以是TimerTask为每个条目实例化一个。实施其run()方法以从地图中删除条目,在schedule()时间 - 这可能是您的情况的结束时间。这样,您就不需要每周清理,并且条目将在它们过期后立即被删除。

当然,注意线程安全,也许通过使用一些线程安全的变体,我的意思是Map实现。

[已编辑]

或者更好的是,使用ScheduledThreadPoolExecutor, 代替。

于 2012-10-24T02:59:53.283 回答
0

您可以创建一个 TreeSet

TreeSet<DateObject> yourTreeSet = new TreeSet<DateObject>(new DateComparator());

然后实现您的比较器,对象将在您将它们添加到 TreeSet 时进行排序

于 2012-10-24T01:37:02.047 回答