2015-08-17 14 views
5

我有其最大大小是5000。當一個對象尚未的時間等5,10或100秒的類型特定量更新時,它會從列表中刪除的對象的列表。ScheduledExecutorService的性能

什麼是處理這種情況,最好還是優先選擇?

  • 爲每個對象更新使用計劃任務。取消舊的並重置新的。

  • 或者使用固定延時一個預定的任務說500毫秒。通過時間比較檢查舊的對象...

  • 或別的東西。

你有什麼建議?

+0

你可以讓對象自己聲明它們已經過期,然後h一個聽衆服務處理他們? – Rossiar

+0

在谷歌搜索'java TimedList'。 – arturo

+0

這實際上取決於在從列表中移除某些東西時是否需要執行任何操作。如果這是一個簡單的刪除,你可以只使用一個線程。如果你需要做一些工作,一堆線程將是可取的。 –

回答

0

我實際使用其使用Map<Object, Long>用於存儲每個元件的到期時間的實現,一個java.util.TimerÑ秒運行,並移除每過期元件。

我真的不能說這是最好的實現,因爲我只用它幾百個簡單的元素(即不復雜的對象)。

1

如果你可以使用Google's 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");