1. ホーム
  2. java

[解決済み] take()でブロックしているBlockingQueueに割り込むには?

2023-04-21 23:36:40

質問

からのオブジェクトを取得するクラスがあります。 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?
}

どのように解決するのですか?

スレッドを中断することができない場合は、MyObjHandler がそのように認識する "marker" または "command" オブジェクトをキューに置き、ループから抜け出すという方法もあります。