Giả sử rằng tôi có một sợi tiêu thụ các vật phẩm do một sợi khác tạo ra. Phương thức run của nó là như sau, với inQueue là một BlockingQueueTrong điều kiện nào BlockingQueue.take ném ngoại lệ bị gián đoạn?
boolean shutdown = false;
while (!shutdown) {
try {
WorkItem w = inQueue.take();
w.consume();
} catch (InterruptedException e) {
shutdown = true;
}
}
Bên cạnh đó, một sợi khác nhau sẽ báo hiệu rằng không có nhiều hạng mục công trình bằng cách làm gián đoạn sợi chạy này. Sẽ có() ném một ngoại lệ bị gián đoạn nếu nó không cần chặn để truy xuất mục công việc tiếp theo. tức là nếu nhà sản xuất báo hiệu rằng nó được thực hiện đang lấp đầy hàng đợi công việc, có thể vô tình để lại một số mục trong inQueue hoặc bỏ lỡ gián đoạn không?
Bạn gần như đã làm đúng. Thay vì có * người tiêu dùng * đặt "tắt máy" thành đúng khi bị gián đoạn, thay vào đó hãy * nhà sản xuất * đặt nó thành true trước khi ngắt người tiêu dùng. Lưu ý điều này A) giữ cho mọi thứ đẹp bằng cách tránh giá trị sentinel ("thuốc độc"), B) xử lý chính xác các lần đánh thức giả, và C) tổng quát hơn ở chỗ bạn có thể cố ý ngăn chặn người tiêu dùng xem hàng đợi có trống không. – user359996