@Override
	public final void run()
	{
		boolean failure = true;
		
		if (this.initiate())
		{
			failure = false;
			
			this.running = true;
			
			try
			{
				this.firstUpdate();
				
			}
			catch (Throwable e)
			{
				this.handleException(e);
				
			}
			
			while (this.isRunning() && this.canRun())
			{
				try
				{
					this.rawUpdate();
					
				}
				catch (Throwable e)
				{
					this.handleException(e);
					
				}
				
				this.onPostUpdate();
				
			}
			
			this.running = false;
			
		}
		
		this.onThreadStopped(failure);
		
	}