Điều gì sẽ là việc sử dụng DelayQueue trong thế giới thực , vấn đề chung nào được thiết kế để giải quyết?
Điều gì sẽ là việc sử dụng DelayQueue trong thế giới thực , vấn đề chung nào được thiết kế để giải quyết?
Câu trả lời:
Gần đây tôi đã sử dụng một hàng đợi để giới hạn tỷ lệ.
Đối với giới hạn X sự kiện mỗi giây, hãy đặt từng sự kiện vào hàng đợi trễ với độ trễ 1 giây.
Nếu có các sự kiện X trên delayQueue, hãy lấy () từ hàng đợi (sẽ chặn cho đến khi ít nhất 1 hết hạn). Bằng cách đó, bạn cho phép một vụ nổ ngắn hạn, mà không vượt quá bất kỳ giới hạn dài hạn nào.
Lớp này là hoàn hảo cho một luồng muốn xử lý nhiều sự kiện bị trì hoãn theo thứ tự đúng của chúng.
Giả sử, ví dụ, bạn có một màn hình với 100 đèn nhấp nháy và tất cả các đèn đều nhấp nháy ở các tỷ lệ không liên quan khác nhau. Bạn có thể có một luồng cho mỗi ánh sáng hoặc bạn có thể có một luồng phối hợp tất cả chúng bằng cách sử dụng lớp này. Nó sẽ hoạt động như thế này:
Light
lớp học với tốc độ flashDelayed
giao diện chỉ ra ánh sángLightFlash
DelayQueue
và thêm một cái mới LightFlash
cho mỗi ánh sáng, với độ trễ được đặt phù hợp với tốc độ flash của ánh sángDelayQueue đảm nhận việc xử lý sự kiện tiếp theo.
Hai ví dụ thực tế mà tôi có thể nghĩ ra:
DelayQueue
có thể được thực hiện như một hàng đợi ưu tiên , thường được thực hiện tốt nhất dưới dạng một đống .
việc sử dụng chính sẽ là các bộ định thời tác vụ như các lớp Timer
nếu ai đó có thể làm cho độ trễ độc lập khỏi đồng hồ hệ thống (điều mà tôi tin là bạn có thể, dù không chắc chắn), bạn có thể sử dụng nó cho các sự kiện trò chơi như "sau 5 tích tắc chuyển sang X" (nếu không thì jitter đồng hồ sẽ khiến điều này không đáng tin cậy)
Lưu ý rằng độ trễ được liên kết với các phần tử đi trên hàng đợi thay vì chính hàng đợi. Một số đối tượng đi vào hàng đợi có thể có độ trễ bằng 0, trong khi một số đối tượng có thể có độ trễ dài hơn nhiều:
http://docs.oracle.com/javase/6/docs/api/java/util/concản/Delayed.html
Với suy nghĩ này, tôi có thể nghĩ ra một vài trường hợp sử dụng - mặc dù chúng có thể rất dễ vỡ và một chút mùi mã liên quan đến luồng tin nhắn của bạn. Tôi sẽ sử dụng các lựa chọn thay thế cho tất cả chúng ngoại trừ trong các tình huống cụ thể:
1) Kiểm soát luồng - chúng tôi biết rằng một đơn hàng mất 60 giây để xử lý, vì vậy đừng đọc thứ tự tiếp theo của hàng đợi cho đến khi đối tượng đã ở đó ít nhất 60 giây.
2) Luồng thông báo - Một hệ thống không đồng bộ cao, nơi chúng tôi gửi yêu cầu tới 2 hoặc 3 dịch vụ bên ngoài và sau đó giải phóng tác vụ tiếp theo để xử lý đơn hàng N giây sau khi chúng tôi biết lô công việc đầu tiên ít nhất sẽ có cơ hội hoàn thành .
3.
4) Ưu tiên tin nhắn - tin nhắn khác nhau hoặc khách hàng khác nhau có thể có chất lượng dịch vụ cao hơn một chút với độ trễ thấp hơn hoặc bằng không.
Trong một số trường hợp, các đối tượng mà bạn đặt trên hàng đợi phải ở trên hàng đợi đó trong một khoảng thời gian nhất định trước khi chúng sẵn sàng để được xử lý. Đây là nơi bạn sử dụng lớp java.util.concản.DelayQueue, thực hiện giao diện BlockingQueue. DelayQueue yêu cầu các đối tượng xếp hàng phải cư trú trên hàng đợi trong một khoảng thời gian xác định.
Để biết ví dụ sử dụng trong thế giới thực, hãy xem bài viết Minding the Queue tại trang devx
... Ví dụ trong thế giới thực mà tôi nghĩ ra để minh họa điều này (có thể khiến bạn đói) liên quan đến bánh nướng xốp. Chà, các đối tượng Muffin (như chúng ta đang nói Java Java không có ý định chơi chữ cà phê). Giả sử bạn có DelayQueue mà bạn đặt các đối tượng Muffin ... Về cơ bản, phương thức getDelay nói rõ thời gian còn lại để đối tượng được giữ trong DelayQueue. Khi số được trả về bởi phương thức này trở thành 0 hoặc nhỏ hơn 0, đối tượng đã sẵn sàng (hoặc trong ví dụ này, được nướng) và được phép khử ...
Vì bạn không thực sự muốn ăn một chiếc Muffin chưa được nấu chín hoàn toàn, hãy đặt Muffin vào DelayQueue trong thời gian nấu được đề xuất ...