我使用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