2012-02-05 89 views
13

当从文件内容填充队列时,深度似乎不会增加,因为在此实现中未添加元素。队列满,深度阻塞队列,需要澄清

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 
     } 

add更换offer,异常,如果抛出

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

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

回答

17

检查SynchronousQueue的文档:

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

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

将指定元素插入此队列中,如果另一个线程等待接收:如果没有消费者

offer方法不会做任何事情。

+3

RTFM ftw。谢谢你。将在10分钟内接受 – JAM 2012-02-05 18:43:56

+16

实际上,由于没有空气呼吸,您甚至无法在有同步队列的情况下呼吸。同步队列是一切,什么都不是,它无处不在。单纯地球居民无法理解同步队列的形而上学意义。 – Tudor 2012-02-05 18:48:01

2

从的Javadoc:

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