Jam*_*sev 14 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
}
Run Code Online (Sandbox Code Playgroud)
替换offer时add,抛出异常
Exception in thread "main" java.lang.IllegalStateException: Queue full
...
Run Code Online (Sandbox Code Playgroud)
我做错了什么?插入第一个元素后,为什么队列立即满了?
Mat*_*Mat 17
查看文档SynchronousQueue:
阻塞队列,其中每个put必须等待take,反之亦然.同步队列没有任何内部容量,甚至没有容量.您无法查看同步队列,因为只有在您尝试接受该元素时才会出现该元素; 你不能添加一个元素(使用任何方法),除非另一个线程试图删除它 ; 你不能迭代,因为没有什么可以迭代.队列的头部是第一个排队线程尝试添加到队列的元素; 如果没有排队的线程,则不添加任何元素,并且head为null.出于其他Collection方法(例如contains)的目的,SynchronousQueue充当空集合.此队列不允许null元素.
在尝试添加到队列之前,您需要让消费者进行设置和等待.
offer如果没有消费者,该方法不会做任何事情:
如果另一个线程正在等待接收它,则将指定的元素插入此队列.
您可以使用 ArrayBlockingQueue。这是一个由数组支持的有界阻塞队列。该队列对元素 FIFO(先进先出)进行排序。ArrayBlockingQueue 是一个经典的“有界缓冲区”,其中一个固定大小的数组保存由生产者插入并由消费者提取的元素。 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html (对于那些也踩过耙子的人)