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

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

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

add替换offer时,抛出exception

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

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

查看SynchronousQueue的文档:

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

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

如果没有消费者,则offer方法不会执行任何操作:

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

来自Javadoc:

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

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