scope jdk_watchService_start. static new Flag #started; static new MultiMap #listeners; // values: voidfunc(File) static int #interval = 50; // larger interval helps show less duplicate events (https://stackoverflow.com/questions/16777869/java-7-watchservice-ignoring-multiple-occurrences-of-the-same-event/34818620#34818620) static WatchService jdk_watchService_start() { final WatchService service = jdk_defaultWatchService(); if (started.raise()) thread "Watch Service" { while licensed { WatchKey key = service.poll(10, TimeUnit.SECONDS); if (key != null) { Path dir = cast key.watchable(); sleep(interval); L> events = key.pollEvents(); new LinkedHashSet changedFiles; for (WatchEvent event : reversedIterator(events)) pcall { final Path changed = (Path) event.context(); File full = newFile(dir.toFile(), changed.toFile().getPath()); changedFiles.add(full); //print("WatchService Changed: " + full + ", " + event.kind()); } for (File f : changedFiles) pcallFAll(listeners.get(key), f); key.reset(); } } } ret service; } end scope