public final void run() {
		
		runningThread = Thread.currentThread();
		String threadNameOriginal = runningThread.getName();
		if (threadNameOriginal == null) threadNameOriginal = "T" + getClass().getSimpleName();
		if (threadName != null && !threadName.isEmpty()) runningThread.setName(threadName);
		else threadName = threadNameOriginal;
		try {
			execute();
		} catch (InterruptedException ie) {
			interruptedException = ie;
		} catch (Throwable t) {
			runtimeError = t;
		} finally {
			if (threadNameOriginal != null && runningThread != null) runningThread.setName(threadNameOriginal);
			runningThread = null;
			if (log.isDebugEnabled()) {
				log.debug(toString());
			}
			if (runtimeError != null) {
				log.error(threadName + " stopped after unexpected error.", runtimeError);
			}
		}
	}