14

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

    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
  ...

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

4

3 回答 3

18

检查文档SynchronousQueue

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

您需要让消费者设置并等待,然后才能尝试添加到队列中。

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

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

于 2012-02-05T18:42:02.857 回答
5

You can use ArrayBlockingQueue. This is a bounded blocking queue backed by an array. This queue orders elements FIFO (first-in-first-out). ArrayBlockingQueue is a classic "bounded buffer", in which a fixed-sized array holds elements inserted by producers and extracted by consumers. http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html (for those who also stepped on a rake)

于 2013-10-09T00:03:02.957 回答
2

来自 Javadoc:

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

于 2012-02-05T18:42:48.257 回答