在下面的伪代码中,我有一个 poll()
函数,该函数在主线程中永远被调用。当我在 poll()
中没有使用 sleep()
语句时,每分钟只有 2-3 个项目被另一个线程添加到队列中。这是否意味着轮询会阻塞 put()
语句?
如何解决这个问题?
public class Test extends Thread{
private LinkedBlockingQueue<Object> queue = null;
Test(){
queue = new LinkedBlockingQueue<Object>(10);
}
public void run(){
// Do stuff, get incoming object from network
queue.put(o);
}
public Object poll(){
Object o = queue.poll();
sleep(1000);
return o;
}
}
最佳答案
Does this mean that polling blocks the put() statement?
不,LinkedBlockingQueue
是完全可重入的,并且 poll()
方法不会阻塞 put()
。但是,poll()
方法会立即返回。您可能应该使用 queue.take()
来等待队列中出现项目,而不是在队列为空时返回 null。
// wait for there to be an object in the queue
Object o = queue.take();
// no sleep necessary
return o;
由于您正在构建一个包含 10 个条目的受限阻塞队列,我猜想 main 在 sleep()
上阻塞,然后队列就会填满并减慢您的程序。如果 poll()
返回 null
并 sleep 较短的时间,您可能应该只sleep
。
编辑: 正如 @JohnVint 在评论中提到的,另一种选择是使用 poll(long, TimeUnit)
方法,该方法将等待将项目添加到该时间段的队列,如果计时器到期则返回null
。这是等待队列中的某些内容的更简洁的方式。
// wait for 1000ms for there to be an object in the queue
Object o = queue.poll(1000, TimeUnit.MILLISECONDS);
// no sleep necessary
return o;
关于java - 轮询是否会阻塞 LinkedBlockingQueue 中的其他操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10589445/