我使用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
}
}
}
有人经历过类似的事吗?
答案 0 :(得分:2)
队列是FIFO(先进先出)数据结构。从队列中获取对象后,它将不再是该数据结构的一部分。你必须把它放回队列。
如果你只想查看元素,你可能想要使用peek()。
答案 1 :(得分:2)
在队列中,take()和poll()方法检索数据并将其从队列中删除。这可能是您丢失数据的原因。如果要检索数据但不想删除它,请使用peek()。
答案 2 :(得分:0)
莫迪先生提到了这个问题。
你能告诉我你如何使用它的确切场景吗?因为take()和pull()都是同步方法,但两个线程都可能在同一个Object上工作。所以数据将被弹出并打印出来两个线程。上下文切换有可能来到同一个线程,同一个线程再次调用poll(),你可能会在下一个回合中寻找线程2