2

在下面的伪代码中,我有一个poll()在主线程中被永久调用的函数。当我在没有sleep()语句的情况下执行此操作时poll(),其他线程每分钟仅将 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;
    }
}
4

1 回答 1

14

这是否意味着轮询会阻塞 put() 语句?

不,LinkedBlockingQueue是完全可重入的,并且该poll()方法不会阻止put(). 但是,该poll()方法会立即返回。如果队列为空,您可能应该使用queue.take()which 等待队列中有一个项目,而不是返回 null 。

// wait for there to be an object in the queue
Object o = queue.take();
// no sleep necessary
return o;

由于您正在构建一个包含 10 个条目的受限阻塞队列,我猜想 main 正在阻塞,sleep()然后队列会填满并减慢您的程序。您也许应该只sleeppoll()返回null并睡眠更短的时间时才应该这样做。

编辑:正如评论中提到的@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;
于 2012-05-14T19:01:47.713 回答