Java can';无法在集合中获取元素
拜托,我的web应用程序有一些问题 我不能在这里粘贴我的代码(太大了,我很难重现错误),但是,这是我的问题 我有一个包含集合的对象。我使用BlockquingQueue在一些线程之间共享这个对象。第二种线程是servlet 当我将objet放入队列时,集合不是空的,我可以显示它们的元素 但是,当我使用相同的元素时,集合大小不是null,但它没有元素 注:我在排队时没有问题。我的问题是它们的属性类型是Java can';无法在集合中获取元素,java,servlets,concurrency,blockingqueue,Java,Servlets,Concurrency,Blockingqueue,拜托,我的web应用程序有一些问题 我不能在这里粘贴我的代码(太大了,我很难重现错误),但是,这是我的问题 我有一个包含集合的对象。我使用BlockquingQueue在一些线程之间共享这个对象。第二种线程是servlet 当我将objet放入队列时,集合不是空的,我可以显示它们的元素 但是,当我使用相同的元素时,集合大小不是null,但它没有元素 注:我在排队时没有问题。我的问题是它们的属性类型是集合。它向我展示了一种奇怪的行为 代码的很大一部分: public class HttpColle
集合
。它向我展示了一种奇怪的行为
代码的很大一部分:
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;
}
}
公共类HttpCollectionConsumer扩展JCasAnnotator\u ImplBase{
private static BlockingQueue=new LinkedBlockingQueue();
私有静态布尔值hasNext=true;
公共void initialize(UimaContext上下文)引发ResourceInitializationException{
super.initialize(上下文);
}
@凌驾
公共无效进程(JCas JCas)抛出AnalysisEngineProcess异常{
//TODO自动生成的方法存根
edu.cmu.lti.oaqa.type.input.Question q=TypeUtil.getQuestion(jcas);
System.out.println(“获取文本”+q.getText());
问题=新问题(q.getId(),q.getText());
Focus Focus=TypeUtil.getFocus(jcas);
集合类型=TypeUtil.getLexicalAnswerTypes(jcas);
答案a=新答案();
a、 设置问题(问题);
a、 设置焦点(焦点);
a、 集合类型(类型);
试一试{
System.out.println(“标识:(“+a+”)类型“+a.getTypes().iterator().next());
System.out.println(“答案类型不是空的:+a.getTypes().iterator().hasNext());
已同步(此){
排队.付诸表决(a);
睡眠(1000);
}
System.out.println(“放置完成”);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
公共静态同步void put(回答问题)抛出InterruptedException{
System.out.println(“新答案:+问题”);
排队。报价(问题);
}
public synchronized static Answer take()引发InterruptedException{
答案a=队列。take();
《睡眠》(2000年);
System.out.println(“某人接受(+a+”),剩余:“+queue.size());
System.out.println(“答案类型不是空的:+a.getTypes().iterator().hasNext());
返回a;
}
公共同步静态阻止队列getQueue(){
返回队列;
}
公共同步静态无效停止(){
hasNext=false;
}
}
有人知道原因吗?您只能从队列中获取一个项目一次,先入先出。如果要多次或直接访问对象,应使用列表并将其转换为集合。
此外,如果您在线程之间共享您的对象,那么只有一个线程能够访问提到的对象,因为在被一个线程处理后,它将不再在队列中。如果您说您无法从队列中两次获取元素,那么队列就不适用于这种用例。队列是FIFO数据结构。用列表代替。不,我是第一次。我无法获取元素,但类型集合的属性已损坏。他返回给我非零大小,但没有元素。首先,
BlockingQueue
是一个接口,而不是一个类。您使用的是哪种实现?LinkedBlockingQueue我也尝试了ArrayBlockingQueue和ConcurrentLinkedQueue我可以获取我的元素。但它们的属性已被破坏。这些收藏品给我展示了一种奇怪的行为。它返回非零大小,但包含任何内容。