2013-10-18 173 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的一个实例不会运行多少次。