public void run(){
		try{
			for(ListenerPriority priority : priorityOrder){
				//Use each priority in the correct order
				for(RegisteredEventListener listener : listeners.get(priority)){
					//Call each RegisteredEventListener at each priority
					boolean cancelled = false;
					if(event instanceof Cancellable){
						//If event is cancellable, store its cancellation state
						//In case of exception, cancellation will be rolled back
						cancelled = ((Cancellable)event).isCancelled();
					}
					try{
						listener.fireEvent(event);
					}catch(Exception e){
						exceptions.add(e);
						if(event instanceof Cancellable){
							//An exception occurred, roll back the cancellation
							((Cancellable)event).setCancelled(cancelled);
						}
					}
				}
			}
		}finally{
			latch.countDown();
		}
	}