Task cancellation. Poison Pills

Poison Pills могут быть использованы для остановки consumer/producer связки. Идея, в том, что producer в момент, когда ему сказано остановиться добавляет в блокирующую очередь Poison Pill. Consumer, при извлечении объекта из очереди сравнивает его с Poison Pill и если consumer видит такой объект, то он останавливает свою работу.

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;


public class PoisonPillsService {
	
	private static final String POISON = \"POISION_PILL\";
	
	private final BlockingQueue<String> queue; 
	
	private ConsumerThread consumer;
	private ProducerThread producer;
	
	public PoisonPillsService() {
		queue = new LinkedBlockingQueue<String>();
	}
	
	class ProducerThread extends Thread {
		public void run() {
			try {
				produce();
			} catch (InterruptedException e) {
				while (true) {
					try {
						queue.put(POISON);
					} catch (InterruptedException retry) {}
				}
			}
		}
		
		private void produce() throws InterruptedException {
		}
	}
	
	class ConsumerThread extends Thread {
		public void run() {
			try {
				while (true) {
					String s = queue.take();
					if (s == POISON) {
						break;
					}
					consume(s);
				}
			} catch (Exception e) {}
			
		}
		private void consume(String s) {
		}
	}

	public void start() {
		consumer.start();
		producer.start();
	}
	
}

Комментариев нет:

Отправить комментарий