Mam klasy, która pobiera obiekty z BlockingQueue
i przetwarza je, wywołując take()
w pętli ciągłej. W pewnym momencie wiem, że do kolejki nie zostaną dodane żadne obiekty. Jak przerwać metodę take()
, aby przestała blokować?Jak przerwać działanie BlockingQueue, które blokuje się przy pobieraniu()?
Tutaj jest klasa, która przetwarza obiekty:
public class MyObjHandler implements Runnable {
private final BlockingQueue<MyObj> queue;
public class MyObjHandler(BlockingQueue queue) {
this.queue = queue;
}
public void run() {
try {
while (true) {
MyObj obj = queue.take();
// process obj here
// ...
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
i tu jest metoda, która używa tej klasy do przetwarzania obiektów:
public void testHandler() {
BlockingQueue<MyObj> queue = new ArrayBlockingQueue<MyObj>(100);
MyObjectHandler handler = new MyObjectHandler(queue);
new Thread(handler).start();
// get objects for handler to process
for (Iterator<MyObj> i = getMyObjIterator(); i.hasNext();) {
queue.put(i.next());
}
// what code should go here to tell the handler
// to stop waiting for more objects?
}
Jest to tak zwane podejście "Poison Pill Shutdown" i jest szeroko omawiane w "Java Concurrency in Practice", w szczególności na stronach 155-156. –