请问,我的网络应用程序存在一些问题。
我无法在此粘贴我的代码(太大而且我很难重现错误)但是,这是我的问题。
我有一个包含集合的对象。我使用BlockquingQueue在一些线程之间分享这个对象。第二种线程是servlet。
当我把我的objet放入队列时,集合不是空的,我可以显示它们的元素。
但是,当我使用相同的元素时,集合大小不为null,但它没有元素。
注意:我没有问题让队列中的objet。我的问题是Collection
类型的属性。它向我展示了一个奇怪的行为。
代码的很大一部分:
public class HttpCollectionConsumer extends JCasAnnotator_ImplBase{
private static BlockingQueue<Answer> queue = new LinkedBlockingQueue<>();
private static boolean hasNext = true;
public void initialize(UimaContext context) throws ResourceInitializationException{
super.initialize(context);
}
@Override
public void process(JCas jcas) throws AnalysisEngineProcessException {
// TODO Auto-generated method stub
edu.cmu.lti.oaqa.type.input.Question q = TypeUtil.getQuestion(jcas);
System.out.println("get Text " + q.getText());
Question question = new Question(q.getId() , q.getText());
Focus focus = TypeUtil.getFocus(jcas);
Collection<LexicalAnswerType> types = TypeUtil.getLexicalAnswerTypes(jcas);
Answer a = new Answer();
a.setQuestion(question);
a.setFocus(focus);
a.setTypes(types);
try {
System.out.println("identifiant : ( " + a + " ) types " + a.getTypes().iterator().next());
System.out.println("the answer type is not empty : " + a.getTypes().iterator().hasNext());
synchronized(this){
queue.put(a);
Thread.sleep(1000);
}
System.out.println("putting finished " );
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static synchronized void put(Answer question) throws InterruptedException{
System.out.println("new answer : " + question);
queue.offer(question);
}
public synchronized static Answer take() throws InterruptedException{
Answer a = queue.take();
Thread.sleep(2000);
System.out.println(" someone takess ( " + a + " ) , remaining: " + queue.size());
System.out.println("the answer type is not empty : " + a.getTypes().iterator().hasNext());
return a;
}
public synchronized static BlockingQueue<Answer> getQueue(){
return queue;
}
public synchronized static void stop(){
hasNext = false;
}
}
有人可以知道为什么吗?
答案 0 :(得分:0)
您只能从队列中获取一个项目,First First In First Out。如果要多次或直接访问对象,则应使用List并将其转换为Collection。 此外,如果您在线程之间共享您的对象,则只有其中一个线程能够访问所提及的对象,因为在被一个线程处理之后,它将不再在队列中。