@Override
	public void run() {
		try {
			long iterationCount = 0;
			while(!this.notifier.shouldHalt(ThreadType.CONSUMERS)){
				
				if(this.queue.isEmpty()){
					this.log.debug(this.toString() + " reports empty guess queue");
				}
				
				AbstractGuessObject go = this.queue.take();
				
				this.log.debug(this.toString() + " taken " + go.toString());
				if(this.exConsume.isCorrect(go)){
					this.exType.storeCorrectGuess(go);
					this.log.found(go.toString());
					if(this.exType.stopOnFirstCorrectGuess()){
						this.notifier.haltAll();
					}
				}
				this.exConsume.reset();
				
				iterationCount = this.counter.incrementAndGet();
				if(iterationCount % this.countMax == 0){
					this.log.info(this.toString() + " Iteration: " + iterationCount + " Current Guess: " + this.exType.provideConsoleUpdate(go));
				}
			}
		} catch (InterruptedException e) {
			if(!this.notifier.shouldHalt(ThreadType.CONSUMERS))
				this.log.debug(this.toString() + " Interrupted.");
		}
	}