队列已满,在阻塞队列的深度,需要澄清

时间:2012-02-05 18:37:31

标签: java blockingqueue

从文件内容填充队列时,深度似乎不会增加,因为此实现中未添加元素。

    BlockingQueue<String> q = new SynchronousQueue<String>();
            ...
        fstream = new FileInputStream("/path/to/file.txt");
            ...
        while ((line = br.readLine()) != null) {
            if (q.offer(line))
                System.out.println("Depth: " + q.size()); //0
        }

offer替换为add时,抛出异常

Exception in thread "main" java.lang.IllegalStateException: Queue full
  ...

我做错了什么?插入第一个元素后,为什么队列立即满了?

3 个答案:

答案 0 :(得分:17)

查看SynchronousQueue的文档:

  

阻塞队列,其中每个put必须等待take,反之亦然。同步队列没有任何内部容量,甚至没有容量。您无法查看同步队列,因为只有在您尝试接受该元素时才会出现该元素; 你不能添加一个元素(使用任何方法),除非另一个线程试图删除它;你不能迭代,因为没有什么可以迭代。队列的头部是第一个排队线程尝试添加到队列的元素;如果没有排队的线程,则不添加任何元素,并且head为null。出于其他Collection方法(例如contains)的目的,SynchronousQueue充当空集合。此队列不允许使用null元素。

在尝试添加到队列之前,您需要让消费者进行设置和等待。

如果没有消费者,offer方法不会做任何事情:

  

将指定的元素插入此队列,如果另一个线程正在等待接收它。

答案 1 :(得分:2)

来自Javadoc:

。一个阻塞队列,其中每个put必须等待一个take,反之亦然。同步队列没有任何内部容量,甚至没有一个

的容量

答案 2 :(得分:1)

您可以使用ArrayBlockingQueue。这是一个由数组支持的有界阻塞队列。此队列对元素FIFO(先进先出)进行排序。 ArrayBlockingQueue是一个经典的“有界缓冲区”,其中固定大小的数组包含由生产者插入并由消费者提取的元素。 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html (对于那些也踩过耙子的人)