2012-10-24 98 views
3

所以現在我有一個存儲Calendar對象的hashmap(只需要一種存儲日期的方法)。每個值都存儲兩個Calendar對象,一個表示事件的開始,另一個表示事件的結束。用戶通過gui輸入這些內容,並且可以跨越數週和數月。java:自動更新hashmap

我需要做的是能夠刪除這些條目,當他們到期,意味着他們的第二個日曆對象已根據現實世界的日期通過。我希望在實例運行的時候自動完成。

我的想法是有一個計時器線程運行,每週一次它可以通過hashmap中的所有條目,並刪除已過期的條目。我知道它不是那麼實際,它是一個學校項目。但我只是在尋找有助於以有效的方式實施這些想法或設計模式。

謝謝,讓我知道你是否需要任何更多的信息。

+0

對於每個條目,如果沒有專用線程(向下計數到期),這可能是您的最佳選擇。 – jpm

+0

您可以查看http://www.java2s.com/Code/Java/Development-Class/UsejavautilTimertoscheduleatasktoexecuteonce5secondshapasspassed.htm 和http://docs.oracle.com/javase/1.4.2/docs/api/ java/util/Timer.html –

+0

不要重新發明輪子! [ehcache](http://ehcache.org/)已經爲你做了這個,讓我們配置算法來*更新你的緩存(地圖)。 –

回答

1

有一個執行維護任務的後臺線程是一個好主意,是非常普遍的做法。儘管HashMap不是線程安全的,但需要同步其訪問權限,或者使用線程安全類(如ConcurrentHashMap)進行替換。

+0

啊我明白了,謝謝。我擔心的主要問題是這個計時器線程練習是否是好的,謝謝你清除它。 – user1769946

0

您可以改爲創建一個TreeSet

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

然後實現你的比較,以及對象將被分類爲您在TreeSet中

1

添加它們使用Calendar只會帶來悲傷 - 這是一個可怕的類,加載陷阱和錯誤。

取而代之的是,根據Date.getTime()將開始和結束的值存儲爲long,並將它們與System.currentTimeMillis()進行比較,以保持乾淨和簡單。

+0

雅我想,我真的不需要任何其他目的的日曆對象,thnks。 – user1769946

+0

儘管我也反對存儲日曆,但我認爲最好將它們存儲爲日期。只要您在Date中不觸及那些被棄用的方法,Date就可以被當作一個可以安全使用的不可變值對象,並且它具有語義含義。 –

+0

@AdrianShum對於'Date'是安全的,你是錯誤的: ['Date.setTime(long)'](http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#setTime(long))方法*不*棄用,但魚雷不變性! – Bohemian

0

其他選項可以爲每個條目實例化一個TimerTask。實施它的run()方法從地圖上刪除條目,時間爲schedule() - 這可能是您的情況的結束時間。這樣,您不需要每週清理一次,並且條目一過期就會被刪除。

當然,照顧線程安全,也許通過使用一些thread-safe variant,我的意思是Map實現。

[編輯]

或者仍然較好,使用ScheduledThreadPoolExecutor,來代替。

1

這也許是有用的: http://code.google.com/p/guava-libraries/wiki/CachesExplained 番石榴具有「高速緩存」 -mechanism,即HANDELS超時,...

所以處理是爲你做的,但照顧:沒有線程運行在背景中。維護工作在wirtes期間完成。信息也包含在鏈接中。

番石榴解決方案「解釋」的另一種方式。 爲什麼不處理在訪問期間告訴你超時元素的列表/映射,超時元素是超時還是自己關閉。 你不必從外面管理元素,他們可以自己處理超時。 這種方式對用戶而言非常簡單和透明。

+0

感謝這實際上看起來非常好。希望它工作得很好。 – user1769946