BlockingQueueでイテレータメソッドを使用しようとしましたが、hasNext()が非ブロッキングであることがわかりました。つまり、要素が追加されるまで待機せず、要素がない場合はfalseを返します。
だからここに質問があります:
- これは悪いデザインですか、それとも間違った期待ですか?
- BLockingQueueのブロッキングメソッドをその親のCollectionクラスメソッドで使用する方法はありますか(たとえば、あるメソッドがコレクションを期待していた場合、ブロッキングキューを渡し、キューにさらに要素が含まれるまでその処理が待機することを期待できますか)
これがサンプルコードブロックです
public class SomeContainer{
public static void main(String[] args){
BlockingQueue bq = new LinkedBlockingQueue();
SomeContainer h = new SomeContainer();
Producer p = new Producer(bq);
Consumer c = new Consumer(bq);
p.produce();
c.consume();
}
static class Producer{
BlockingQueue q;
public Producer(BlockingQueue q) {
this.q = q;
}
void produce(){
new Thread(){
public void run() {
for(int i=0; i<10; i++){
for(int j=0;j<10; j++){
q.add(i+" - "+j);
}
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
}
}
static class Consumer{
BlockingQueue q;
public Consumer(BlockingQueue q) {
this.q = q;
}
void consume() {
new Thread() {
public void run() {
Iterator itr = q.iterator();
while (itr.hasNext())
System.out.println(itr.next());
}
}.start();
}
}
}
このコードは、最大で1回だけ反復を出力します。