ScheduledExecutorService 性能问题

5
我有一个对象列表,其最大大小为5000。当某个对象在特定类型的时间内(如5、10或100秒)未被更新时,它将从列表中删除。
对于这种情况,最佳或首选选项是什么?
以下是几个选项:
1. 对于每个对象更新使用计划任务。取消旧的并重置新的。 2. 或者使用一个具有固定延迟(例如500毫秒)的计划任务。通过时间比较检查旧对象... 3. 或者其他一些方法。
您推荐哪种方法?

你能让对象自己声明它们已经过期,然后有一个监听器服务来处理它们吗? - Rossiar
在谷歌搜索“Java TimedList”。 - user520458
这真的取决于您是否需要在从列表中删除内容时执行任何操作。如果只是简单地进行删除,那么您可以使用单个线程。如果您需要执行一些工作,则最好使用线程池。 - Alexander Torstling
实际上我是误打误写从我朋友的账户里发出了这个问题。我已经退出了该账户。有些对象需要不同的过期时间,例如5、10或100。此外,在过期后还需要进行一些进一步的操作。 - user706071
2个回答

1
如果您能使用Google的Guava,那么您应该尝试一下Cache类。
例如,您可以为每种类型的对象设置一个缓存:
LoadingCache<String, ObjectOfType1> type1Cache = CacheBuilder.newBuilder()
   .maximumSize(5000)
   .expireAfterWrite(5, TimeUnit.SECONDS)
   .removalListener(MY_LISTENER)
   .build(
       new CacheLoader<String, ObjectOfType1>() {
         public Graph load(String key) throws AnyException {
           return createExpensiveGraph(key);
         }
       });

而对于Type2

LoadingCache<String, ObjectOfType2> type2Cache = CacheBuilder.newBuilder()
   .maximumSize(5000)
   .expireAfterWrite(10, TimeUnit.SECONDS)
   .removalListener(MY_LISTENER)
   .build(
       new CacheLoader<String, ObjectOfType2>() {
         public Graph load(String key) throws AnyException {
           return createExpensiveGraph(key);
         }
       });

然后,您可以像使用Map一样使用缓存:

ObjectOfType1 o1 = type1Cache.get("1");
ObjectOfType2 o2 = type2Cache.get("2");

0

我实际上使用的是一种实现,它使用了一个Map<Object, Long>来存储每个元素的过期时间,并使用java.util.Timer每隔n秒运行一次,删除每个过期的元素。

我不能说这是最好的实现,因为我只用它来处理几百个简单的元素(即不是复杂对象)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接