How to interrupt a BlockingQueue which is blocking on take()?
If interrupting the thread is not an option, another is to place a "marker" or "command" object on the queue that would be recognized as such by MyObjHandler and break out of the loop.
BlockingQueue<MyObj> queue = new ArrayBlockingQueue<MyObj>(100);
MyObjectHandler handler = new MyObjectHandler(queue);
Thread thread = new Thread(handler);
thread.start();
for (Iterator<MyObj> i = getMyObjIterator(); i.hasNext(); ) {
queue.put(i.next());
}
thread.interrupt();
However, if you do this, the thread might be interrupted while there are still items in the queue, waiting to be processed. You might want to consider using poll
instead of take
, which will allow the processing thread to timeout and terminate when it has waited for a while with no new input.