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

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)

替换offeradd,抛出异常

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如果没有消费者,该方法不会做任何事情:

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

  • 事实上,在同步队列存在的情况下,你甚至无法进行BREATHE,因为没有空气可以通风.同步队列就是一切,没有任何东西,它无处不在.仅仅是地球居民无法理解同步队列的形而上学含义. (22认同)
  • RTFM ftw.谢谢你.将在10分钟内接受 (3认同)

gab*_*bba 5

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