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();
}
}
Task cancellation. Poison Pills
Poison Pills могут быть использованы для остановки consumer/producer связки. Идея, в том, что producer в момент, когда ему сказано остановиться добавляет в блокирующую очередь Poison Pill. Consumer, при извлечении объекта из очереди сравнивает его с Poison Pill и если consumer видит такой объект, то он останавливает свою работу.
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий