Tôi đã gặp phải sự cố hai lần ngay bây giờ, theo đó một chuỗi nhà sản xuất tạo ra các mục công việc N, gửi chúng đến ExecutorService
và sau đó cần đợi cho đến khi tất cả các mục N đã được xử lý.CountDownLatch linh hoạt?
Hãy cẩn thận
- N là không được biết trước. Nếu tôi chỉ đơn giản là tạo ra một
CountDownLatch
và sau đó có chủ đề sản xuấtawait()
cho đến khi tất cả công việc được hoàn thành. - Sử dụng
CompletionService
không phù hợp vì mặc dù chủ đề sản xuất của tôi cần chặn (tức là bằng cách gọitake()
) có không có cách nào báo hiệu rằng tất cả công việc đã hoàn tất.
giải pháp ưa chuộng hiện tại của tôi là sử dụng một bộ đếm số nguyên, và để increment này bất cứ khi nào một mục công việc được gửi và sụt lần nó khi một hạng mục công trình được xử lý. Sau khi đăng ký tất cả các nhiệm vụ của N, luồng sản xuất của tôi sẽ cần phải chờ trên khóa, kiểm tra xem có counter == 0
bất cứ khi nào nó được thông báo hay không. Chủ đề của người tiêu dùng sẽ cần phải thông báo cho nhà sản xuất nếu nó đã giảm giá bộ đếm và giá trị mới là 0.
Có cách tiếp cận tốt hơn cho vấn đề này hoặc có cấu trúc phù hợp trong java.util.concurrent
Tôi nên sử dụng hơn là "lăn của riêng tôi"?
Xin cảm ơn trước.
Vào thời điểm nào nhà sản xuất biết có bao nhiêu mục công việc? Khi sản phẩm cuối cùng được sản xuất? –
Giải pháp hiện tại của bạn có thể bị điều kiện chạy đua: sản xuất vật phẩm 1 -> counter ++ -> mặt hàng 1 -> counter-- -> sản xuất mặt hàng 2. Vì bộ đếm đã bị giảm trước khi nhà sản xuất sản xuất vật phẩm tiếp theo, nhà sản xuất nghĩ rằng anh ta đã sẵn sàng. –
@rwwilden: Bạn đúng trong trường hợp này có thể xảy ra. Tuy nhiên, nhà sản xuất của tôi sẽ chỉ kiểm tra/chờ trên quầy sau khi gửi * tất cả * mục công việc và vì vậy nó không đại diện cho một điều kiện chủng tộc trong trường hợp cụ thể này. – Adamski