public void endGame(final AbstractGame game) throws NoGameActiveException {
		synchronized (this) {
			if (this.activeGame == null || this.activeGame != game) {
				throw new NoGameActiveException();
			}
			
			this.activeGame = null;
		}
		
		this.executor.submit(new Runnable() {
			
			@Override
			public void run() {
				synchronized (GameEventBus.this) {
					for (GameEventListener l : listeners ) {
						try {
							l.onGameFinished(game);
						}
						catch (RuntimeException e) {
							logger.warn(e.getMessage());
							logger.debug(e.getMessage(), e);
						}
					}
					
					try {
						EventEngine engine = EventEngine.instance();
						engine.shutdown();
					} catch (InitializationException e) {
						logger.warn(e.getMessage());
						logger.debug(e.getMessage(), e);
					}
					
				}
			}
		});		
	}