code: @Override
  	public void run() {
  		while (!stopWatching.get()) {
  			WatchKey key;
  			try {
  				key = watchService.take();
  			} catch (InterruptedException | ClosedWatchServiceException e) {
  				close();
  				return;
  			}
  			if (key != null) {
  				Path dir = keys.get(key);
  				if (dir == null) {
  					LOGGER.warn("WatchKey not recognized!!");
  					continue;
  				}
  
  				for (WatchEvent<?> event : key.pollEvents()) {
  					WatchEvent.Kind<?> kind = event.kind();
  
  					if (kind == OVERFLOW) {
  						continue;
  					}
  
  					// Context for directory entry event is the file name of
  					// entry
  					Path path = (Path) event.context();
  					Path resolvedPath = ((Path) key.watchable()).resolve(path);
  
  					boolean isDir = Files.isDirectory(resolvedPath, NOFOLLOW_LINKS);
  					Path dirPath = null;
  					if (isDir) {
  						dirPath = ((Path) key.watchable());
  					} else {
  						dirPath = resolvedPath.getParent();
  					}
  
  					JawrWatchEvent evt = new JawrWatchEvent(kind, resolvedPath, dirPath);
  					watchEvents.add(evt);
  				}
  
  				// reset key and remove from set if directory no longer
  				// accessible
  				boolean valid = key.reset();
  				if (!valid) {
  					keys.remove(key);
  
  					// all directories are inaccessible
  					if (keys.isEmpty()) {
  						break;
  					}
  				}
  			}
  		}
  		close();
  	}
docs: /*
  (non-Javadoc)
  
  @see java.lang.Runnable#run()