java - 轮询是否会阻塞 LinkedBlockingQueue 中的其他操作?

标签 java multithreading blockingqueue

在下面的伪代码中,我有一个 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/

相关文章:

java - 我们可以通过调用 class#newInstance() 创建类型化类的实例吗

.net - 在线程之间正确共享变量 (.NET/VB.NET)

multithreading - 如何在wxPython GUI应用程序中实现线程

java - 插入时应为每个线程分配唯一的 id

c++ - 如何在调用C++析构函数时优雅地通过阻塞调用来停止/销毁线程?

Java - LinkedBlockingQueue问题

java - 列表 size() 上的 ConcurrentModificationException

java - JNA ByteBuffer statvfs

java - 每当检查连接时就会运行 schema.sql

Java,如何停止线程