private void deliveryQueuedMessage(int gourpId){
		//System.out.println("\n =======delivery start =======");
		boolean update = true;
		Integer[] timeVector;
		List<CausalOrderMulticastMessage> deleteQueue;
		List<CausalOrderMulticastMessage> holdbackQueue;
		deleteQueue = new LinkedList<CausalOrderMulticastMessage>();
		
		timeVector = groupTimeVector.get(gourpId);
		holdbackQueue = holdbackQueueTable.get(gourpId);
		while(update){
			update = false;
			boolean isReady = true;
			int sourceId = -1;
			for(CausalOrderMulticastMessage msg : holdbackQueue){
				Integer[] msgTimeVector = msg.getTimeVector();
				sourceId = msg.getSource();
				isReady = true;
				if(msgTimeVector[sourceId] == timeVector[sourceId] + 1){
					for(int i = 0; i < msgTimeVector.length; ++i){
						if(i != sourceId && msgTimeVector[i] > timeVector[i]){
							isReady = false;
							break;
						}
					}
				}else{
					isReady = false;
				}
				if(isReady){
					deleteQueue.add(msg);
					timeVector[sourceId] += 1;
					update = true;
					System.out.println("delivery source form " +msg.getSource() + " with time vector: "+getTimeVectorString(msg.getTimeVector()) +": "+msg.getContent());
					System.out.println("local time vector: "+getTimeVectorString(timeVector));
				}
			}
			holdbackQueue.removeAll(deleteQueue);
			groupTimeVector.put(gourpId, timeVector);
		}
		//System.out.println("======= delivery end =======\n");
	}