当前位置: 首页 > 面试题库 >

如何运行后台线程定期清理列表中的某些元素?

仲孙景胜
2023-03-14
问题内容

我目前正在实现缓存。我已经完成了基本的实现,如下所示。我想做的是运行一个线程,该线程将删除满足某些条件的条目。

class Cache {
    int timeLimit = 10; //how long each entry needs to be kept after accessed(marked)
    int maxEntries = 10; //maximum number of Entries
    HashSet<String> set = new HashSet<String>();   
    public void add(Entry t){
        ....
    }

    public Entry access(String key){
        //mark Entry that it has been used
        //Since it has been marked, background thread should remove this entry after timeLimit seconds.
        return set.get(key);
    }
    ....
}

我的问题是,我应该如何实现后台线程,以便该线程可以绕过set中的条目并删除已经存在的条目marked && (last access time - now)>timeLimit

编辑

上面只是代码的简化版本,我没有编写同步语句。


问题答案:

你为什么要重新发明轮子?EhCache(以及任何适当的缓存实现)将为您完成此任务。也更轻巧
MapMaker
Cache从Guava可以自动删除旧条目。

如果您 真的 想自己实现这一点,那就不是那么简单。

  1. 记住同步。您应该使用ConcurrentHashMapsynchronized关键字来存储条目。这可能真的很棘手。

  2. 您必须以某种方式存储每个条目的上次访问时间。每次访问条目时,都必须更新该时间戳。

  3. 考虑驱逐政策。如果maxEntries您的缓存中有多个存储空间,则应先删除哪些存储空间?

  4. 您真的需要后台线程吗?

这令人惊讶,但是EhCache(企业级已经准备好并证明)没有使用后台线程来使旧条目无效。相反,它会等到映射已满并懒惰地删除条目。这看起来是一个不错的权衡,因为线程很昂贵。

  1. 如果您有后台线程,则每个缓存应该有一个线程还是全局线程?您是在创建新缓存时启动新线程还是拥有所有缓存的全局列表?这比您想象的要难…

回答完所有这些问题后,实现就非常简单:每秒大约遍历所有条目,如果满足您已经编写的条件,请删除该条目。



 类似资料:
  • 问题内容: 我想在后台线程中运行一些Runnable。我想使用Handler,因为它便于延迟。我的意思是 凡 可运行 应当运行 后台 线程。是否可以创建这样的处理程序?是否在某个地方有“背景” Looper,或者该如何创建? PS我知道如何使用自定义类扩展Thread,但是比处理程序方式需要更多的编码工作。因此,请不要发布其他解决方案或类似的内容 如果Handler能以“干净”的方式做到这一点,我

  • 我想在后台线程中运行一些Runnable。我想使用Handler,因为它方便延迟。我的意思是 runnable应该在后台线程中运行。有可能创造这样的处理器吗?某个地方有没有“背景”Looper或者我怎么才能创建它? 附言:我知道如何使用自定义类扩展Thread来做到这一点,但它需要更多的编码工作,而不是以处理程序的方式进行。因此,请不要发布其他解决方案或类似内容 我只是想知道汉德勒是否能以“干净”

  • 这是我的密码: 它返回表中所有列的数组。但我不需要把所有的专栏都写下来。我只需要返回以下列:。我对此进行了搜索并找到了答案:(使用函数) 但它并没有返回预期的结果。它返回以下内容: 如您所见,没有和列。我怎样才能修好它?

  • 长话短说,我在掷不公平的骰子,并试图在x个骰子数之后找到任何给定和的概率。实际上有数百张脸和数百个卷轴,所以我不能简单地找到所有可能的组合,然后找到概率,列出大小和内存限制。 我通过寻找所有可能的组合以及它们一次发生一次滚动的概率来解决这个问题。在我找到所有可能的组合和每个组合的概率后,我需要通过将组合的概率与相同的总和相结合来压缩它。 想想组合(1,3)和(2,2)都是唯一的组合,但是它们都有4

  • 好的,我知道如何执行回溯任务,我知道如何执行定期任务(使用handle postdelayed和runnable),我还知道如何从后台线程(通过处理程序)执行UI任务,但我无法执行在UI线程上执行某些操作的定期后台任务。 我每分钟都在尝试执行一些后台任务,在这些任务中我必须打一个网络电话。调用结束后,根据输出,我必须更新UI。我试过这样做 我知道我的实现可能有一些根本性的缺陷,但我不知道如何正确地