gpt4 book ai didi

java - 为什么 iterator.hasNext 不适用于 BlockingQueue?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:17 26 4
gpt4 key购买 nike

我试图在 BlockingQueue 上使用迭代器方法,发现 hasNext() 是非阻塞的 - 即它不会等到添加更多元素,而是在没有元素时返回 false。

下面是问题:

  1. 这是糟糕的设计还是错误的期望?
  2. 有没有办法使用阻塞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();
}
}
}

此代码最多只打印一次迭代。

最佳答案

只是不要将迭代器与队列一起使用。使用 peek()poll()相反或take()如果它是一个 BlockingQueue:

void consume() {
new Thread() {
@Override
public void run() {
Object value;
// actually, when using a BlockingQueue,
// take() would be better than poll()
while ((value=q.poll())!=null)
System.out.println(value);
}
}.start();
}

A Queue是一个 Iterable因为它是一个 Collection,因此需要提供 iterator()方法,但永远不应该使用它,或者您一开始就不应该使用队列。

关于java - 为什么 iterator.hasNext 不适用于 BlockingQueue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6149810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com