2013-10-18 174 views
0

我有一個Singleton服務,它根據系統中發生的事件收集數據。我正在收集這些數據並將它們存儲在一個HashMap這是這個Singleton服務的成員變量。每隔5分鐘我需要將收集的數據寫入磁盤。java的垃圾回收Runnable

爲此,我正在執行一個Runnable任務。既然不能傳遞參數到Java '運行()' 方法,

創建我工人象下面這樣:

FiveMinuteWorker fiveMinTask = new FiveMinuteWorker(hashMap);// hashMap of this singleton service. 

我執行可運行如下:

ScheduledFuture<?> fiveMinTask = fScheduler.scheduleWithFixedDelay(
       fiveMinWorker, initialDelay, 5 * 60 * 1000, TimeUnit.MILLISECONDS 
     ); 

我有2個的問題。

Runnable「運行」我緩存中的數據hashMap到磁盤,它會被垃圾收集運行或將參考流連,因爲他們持有的HashMap從集服務,這將永遠保持的參考之後?

RunnableHashMap被緩存到磁盤後,我可以清除它的內容,這將有效地清除單一服務hashMap中的內容,因爲它具有相同的引用?

在此先感謝。

+2

_「將它運行後的垃圾回收或將引用掛起,因爲他們*持有HashMap的引用」_什麼是第一個「它」?什麼是「他們」 –

+1

它不會被gc'ed,因爲您正在處理同一個實例,而您的服務仍然保留對地圖的引用。如果你在最後清除地圖,它的條目將被gc'ed(如果沒有其他引用)。沒有保證,他們將立即上市。這將取決於您正在使用的Java的GC實現。 – Fildor

+0

旁註:爲什麼「5 * 60 * 1000」和「TimeUnit.MILLISECONDS」而不是「5」和「TimeUnit.MINUTES」? – Fildor

回答

0

scheduleWithFixedDelay()函數在每次運行時都不會創建fiveMinWorker的新實例。它每次在您設置的時間段後運行它都會使用相同的實例。因此,基本上總是隻有五個MinWorker的一個實例不會運行多少次。