无法在集合中获取元素

时间:2017-05-05 16:23:00

标签: java servlets concurrency blockingqueue

请问,我的网络应用程序存在一些问题。

我无法在此粘贴我的代码(太大而且我很难重现错误)但是,这是我的问题。

我有一个包含集合的对象。我使用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;
    }

}

有人可以知道为什么吗?

1 个答案:

答案 0 :(得分:0)

您只能从队列中获取一个项目,First First In First Out。如果要多次或直接访问对象,则应使用List并将其转换为Collection。 此外,如果您在线程之间共享您的对象,则只有其中一个线程能够访问所提及的对象,因为在被一个线程处理之后,它将不再在队列中。