@Override
	public void run() {
		
		logger.info("Starting monitor thread: " + this.getClass().getSimpleName());
		
		T data = null;
		try {
			data = preRun();
			this.cont = true;
		} catch(Throwable t) {
			logger.error("Exception occured in pre watcher run.", t);
			this.cont = false;
		}
				
		try {
		
			while(this.cont) {
				loopImpl(data);
				
				if(performSleep) {
					Thread.sleep(SLEEP_TIME);
				}
			}
		} catch(Throwable t) {
			logger.error("Exception occired in watcher run.", t);
		} finally {
			try {
				postRun(data);
			} catch(Throwable t) {
				logger.error("Exception occured in post watcher run.", t);
			}
			logger.info("Thread exiting.");
		}
	}