Vì vậy, tôi đang sử dụng một BlockingQueue có kích thước cố định [ArrayBlockingQueue] trong một ứng dụng kiểu nhà sản xuất/người tiêu dùng, nhưng tôi muốn người dùng có thể thay đổi kích thước hàng đợi khi đang bay. Vấn đề là không có một thực thi BlockingQueue cho phép thay đổi dung lượng sau khi tạo. Có ai từng đi qua chuyện này trước đây không? Bất kỳ ý tưởng?Tái kích cỡ Java BlockingQueue
Trả lời
Bạn có thể mở rộng LinkedBlockingQueue. Giới hạn của nó là giới hạn mềm (nghĩa là chỉ cần kiểm tra thêm) và bạn có thể thực hiện điều này bạn có thể thay đổi (bằng cách tắt chế độ tích hợp sẵn và tự đặt)
Giải pháp rõ ràng nhất (có thể hoặc không thể thích hợp tùy thuộc vào hoàn cảnh của bạn) sẽ đơn giản là tạo ra một hàng đợi mới với khả năng cập nhật bạn muốn. Sau đó, đẩy mọi thứ từ hàng đợi cũ vào hàng đợi mới.
Nếu bạn làm điều đó, thì tất cả các chuỗi có tham chiếu đến hàng đợi cũ sẽ bị chặn chờ nội dung mới trên hàng đợi cũ thay vì nội dung mới trên hàng đợi mới. –
@ bkail: Đó là lý do tôi nói "tùy thuộc vào hoàn cảnh của bạn". Nếu OP có nhiều tham chiếu đến hàng đợi chặn, thì anh ta cần phải cấu trúc lại để làm cho giải pháp này hoạt động (ví dụ, bằng cách gói hàng đợi trong một đối tượng container hoạt động như một hàng đợi bên ngoài nhưng thực hiện phân bổ mới bên trong khi dung lượng đã thay đổi). –
Điều này là không thể nếu không sao chép/dán rất nhiều mã nội bộ. Bạn thực sự cần phải thực hiện một cưa để thực hiện riêng biệt, ví dụ, một trong Apache Harmony. – jbellis
@jbellis tại sao bạn cần phải sao chép mã vào lớp phụ? –
Bạn không thể có được chức năng mong muốn ở đây bằng cách phân lớp; quá nhiều là cuối cùng/riêng tư. – jbellis