Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java can';无法在集合中获取元素_Java_Servlets_Concurrency_Blockingqueue - Fatal编程技术网

Java can';无法在集合中获取元素

Java can';无法在集合中获取元素,java,servlets,concurrency,blockingqueue,Java,Servlets,Concurrency,Blockingqueue,拜托,我的web应用程序有一些问题 我不能在这里粘贴我的代码(太大了,我很难重现错误),但是,这是我的问题 我有一个包含集合的对象。我使用BlockquingQueue在一些线程之间共享这个对象。第二种线程是servlet 当我将objet放入队列时,集合不是空的,我可以显示它们的元素 但是,当我使用相同的元素时,集合大小不是null,但它没有元素 注:我在排队时没有问题。我的问题是它们的属性类型是集合。它向我展示了一种奇怪的行为 代码的很大一部分: public class HttpColle

拜托,我的web应用程序有一些问题

我不能在这里粘贴我的代码(太大了,我很难重现错误),但是,这是我的问题

我有一个包含集合的对象。我使用BlockquingQueue在一些线程之间共享这个对象。第二种线程是servlet

当我将objet放入队列时,集合不是空的,我可以显示它们的元素

但是,当我使用相同的元素时,集合大小不是null,但它没有元素

注:我在排队时没有问题。我的问题是它们的属性类型是
集合
。它向我展示了一种奇怪的行为

代码的很大一部分:

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我可以获取我的元素。但它们的属性已被破坏。这些收藏品给我展示了一种奇怪的行为。它返回非零大小,但包含任何内容。