からオブジェクトをBlockingQueue取得take()し、連続ループで呼び出すことによってそれらを処理するクラスがあります。ある時点で、これ以上オブジェクトがキューに追加されないことがわかりました。take()メソッドを中断してブロックを停止するにはどうすればよいですか?
オブジェクトを処理するクラスは次のとおりです。
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();
    }
  }
}
そして、このクラスを使用してオブジェクトを処理するメソッドは次のとおりです。
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?
}