缺少LinkedBlockingQueue的第一个元素



我使用LinkedBlockingQueue为我的应用程序进行隐式同步,但如果我使用queue.take()queue.poll(),那么从队列中获取后,前几个元素总是会以某种方式丢失。我已经检查过它是否是同一个物体

这是我的代码:

for ( QueryResult result : tmpPage ) {
    String objectId = result.getPropertyValueByQueryName( "cmis:objectId" );
    writer.writeFile(objectId ); //Only for debugging reasons to 
                                 //compare the input and the output
    try {
        batchJobs.offer( new Node( objectId ), 1,TimeUnit.HOURS);
    } catch(Exception e) {
        errorLogger.error( e.getMessage() );
    }
}

我采取或轮询的地方

Node node = null;
while ( !nodes.isEmpty() ) {
    while((node = nodes.take())!=null ) {
        writer.writeFile( node.getObjectID() ); // Only for debugging reasons
        if ( node != null ) {
            //Do some stuff
        }
    }
}

有人经历过类似的事情吗?

队列是FIFO(先进先出)数据结构。一旦从队列中获取对象,它将不再是该数据结构的一部分。你必须把它放回队列。

如果您只想查看元素,则需要使用peek()。

In-Queuetake()和poll()方法检索数据并将其从队列中删除。这可能是你丢失数据的原因。如果您想检索数据但又不想删除它,请使用peek()。

这个问题是莫迪先生提到的。

你能告诉我你是如何使用这个的确切场景吗?由于take()和pull()都是同步的方法,但两个线程可能在同一个Object上工作。因此数据应该由两个线程弹出并打印。上下文切换有可能发生在同一个线程上,并且同一线程再次调用poll(),您可能会在下一轮中寻找线程2

相关内容

  • 没有找到相关文章

最新更新