2012-02-05 9 views
13

Khi điền hàng đợi từ nội dung của tệp, độ sâu dường như không bao giờ tăng, vì các phần tử không được thêm vào trong quá trình triển khai này.Hàng đợi Đầy đủ, Chiều sâu của Hàng đợi Chặn, làm rõ cần thiết

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 
     } 

Khi thay thế offer với add, ngoại lệ nếu ném

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

am i làm gì sai xin vui lòng? Tại sao hàng đợi đầy ngay lập tức, khi chèn phần tử đầu tiên?

Trả lời

17

Kiểm tra các tài liệu cho SynchronousQueue:

Một hàng đợi chặn trong đó mỗi đặt phải chờ một mất, và ngược lại. Một hàng đợi đồng bộ không có bất kỳ dung lượng bên trong nào, thậm chí không có dung lượng. Bạn không thể nhìn vào hàng đợi đồng bộ vì phần tử chỉ xuất hiện khi bạn cố gắng lấy nó; bạn không thể thêm phần tử (sử dụng bất kỳ phương pháp nào) trừ khi một chuỗi khác đang cố xóa nó; bạn không thể lặp lại vì không có gì để lặp lại. Người đứng đầu hàng đợi là phần tử mà chuỗi xếp hàng đầu tiên đang cố thêm vào hàng đợi; nếu không có chủ đề xếp hàng thì không có phần tử nào được thêm vào và phần đầu là null. Đối với các mục đích của các phương thức Collection khác (ví dụ chứa), một SynchronousQueue đóng vai trò như một bộ sưu tập rỗng. Hàng đợi này không cho phép các phần tử null.

Bạn cần có người tiêu dùng thiết lập và chờ trước khi bạn có thể thử thêm vào hàng đợi.

Các offer phương pháp không làm bất cứ điều gì nếu không có người tiêu dùng:

Chèn các yếu tố quy định vào hàng đợi này, nếu thread khác đang chờ để nhận được nó.

+3

RTFM ftw. Cảm ơn bạn Mat. Sẽ chấp nhận trong 10 phút – JAM

+16

Trong thực tế, bạn thậm chí không thể BREATHE trong sự hiện diện của một hàng đợi đồng bộ như KHÔNG CÓ KHÔNG ĐỂ BREATHE. Một hàng đợi đồng bộ là tất cả mọi thứ và không có gì, nó ở khắp mọi nơi và hư không. Các tác động siêu hình của hàng đợi đồng bộ không thể được hiểu bởi những cư dân trên trái đất. – Tudor

2

Từ Javadoc:

.A chặn hàng đợi trong đó mỗi đặt phải chờ một mất, và ngược lại. Hàng đợi đồng bộ không có bất kỳ dung lượng nội bộ nào, thậm chí không có dung lượng của một

1

Bạn có thể sử dụng ArrayBlockingQueue. Đây là hàng đợi chặn bị chặn được hỗ trợ bởi một mảng. Hàng đợi này yêu cầu các phần tử FIFO (lần đầu tiên ra trước). ArrayBlockingQueue là một "bộ đệm bị chặn" cổ điển, trong đó một mảng có kích thước cố định chứa các phần tử được chèn bởi các nhà sản xuất và được người tiêu dùng trích xuất. http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html (đối với những người cũng đã bước vào cào)