public void run() { // Loop over the registered files and see which have changed. // Use a copy of the list in case listener wants to alter the // list within its fileChanged method. Collection<File> files = new ArrayList<File>(files_.keySet()); for (Iterator<File> i = files.iterator(); i.hasNext(); ) { File file = i.next(); long lastModifiedTime = ((Long) files_.get(file)).longValue(); long newModifiedTime = file.exists() ? file.lastModified() : -1; // Check if file has changed if (newModifiedTime != lastModifiedTime) { // Register new modified time files_.put(file, new Long(newModifiedTime)); // Notify listeners for (Iterator<WeakReference<FileListener>> j = listeners_.iterator(); j.hasNext(); ) { WeakReference<FileListener> reference = j.next(); FileListener listener = (FileListener) reference.get(); // Remove from list if the back-end object has been GC'd if (listener == null) j.remove(); else listener.fileChanged(file); } } } }