title: How to interrupt a BlockingQueue which is blocking on take()?
body: <p>I have a class that takes objects from a <code>BlockingQueue</code> and processes them by calling <code>take()</code> in a continuous loop.  At some point I know that no more objects will be added to the queue.  How do I interrupt the <code>take()</code> method so that it stops blocking?</p>
  
  <p>Here's the class that processes the objects:</p>
  
  <pre><code>public class MyObjHandler implements Runnable {
  
    private final BlockingQueue&lt;MyObj&gt; 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();
      }
    }
  }
  </code></pre>
  
  <p>And here's the method that uses this class to process objects:</p>
  
  <pre><code>public void testHandler() {
  
    BlockingQueue&lt;MyObj&gt; queue = new ArrayBlockingQueue&lt;MyObj&gt;(100);  
  
    MyObjectHandler  handler = new MyObjectHandler(queue);
    new Thread(handler).start();
  
    // get objects for handler to process
    for (Iterator&lt;MyObj&gt; i = getMyObjIterator(); i.hasNext(); ) {
      queue.put(i.next());
    }
  
    // what code should go here to tell the handler
    // to stop waiting for more objects?
  }
  </code></pre>