DelayQueue'nun gerçek dünya kullanımı ne olurdu , çözmek için hangi ortak problem tasarlanmıştır?
DelayQueue'nun gerçek dünya kullanımı ne olurdu , çözmek için hangi ortak problem tasarlanmıştır?
Yanıtlar:
Son zamanlarda oran sınırlaması için bir gecikme kuyruğu kullandım.
Saniyede X olay sınırı için, her olayı 1 saniyelik gecikme ile bir gecikme kuyruğuna yerleştirin.
DelayQueue'da X olayları varsa, kuyruktan () en az 1 sona erene kadar engeller (). Bu şekilde, uzun vadeli sınırları aşmadan kısa süreli bir patlamaya izin verirsiniz.
Bu sınıf, birden çok gecikmeli olayı uygun sıralarıyla işlemek isteyen bir iş parçacığı için mükemmeldir.
Örneğin, 100 yanıp sönen ışıklı bir ekranınız olduğunu ve tüm ışıkların birbiriyle ilişkili olmayan farklı oranlarda yanıp söndüğünü varsayalım. Her ışık için bir iş parçacığına sahip olabilirsiniz veya bu sınıfı kullanarak hepsini bir iş parçacığına koordine edebilirsiniz. Böyle bir şey işe yarayacaktır:
Light
parlama hızına sahip bir sınıfa sahip olmakDelayed
ışığa işaret eden arayüzün bir uygulamasını oluşturun ,LightFlash
DelayQueue
ve yeni bir ekleme LightFlash
ışığın flaş oranı gecikme seti uygun olan, her ışık içinDelayQueue, bir sonraki olayın işlenmesini sağlar.
Düşünebileceğim iki gerçek dünya örneği:
DelayQueue
muhtemelen bir öncelik kuyruğu olarak uygulanır ve bu genellikle en iyi yığın olarak uygulanır .
ana kullanım for Timer sınıfları gibi görev zamanlayıcılarıdır.
Eğer biri sistem saatinden bağımsız olarak geciktirebilirse (ki bunu yapabileceğine inanıyorum, ama emin değilim) "5 keneler X'e geçtikten sonra" gibi oyun etkinlikleri için kullanabilirsiniz (aksi takdirde saat titremesi bunu güvenilmez yapar)
Gecikmelerin, kuyruğun kendisi yerine kuyruğa giden öğelerle ilişkili olduğunu unutmayın. Kuyruğa giren bazı nesnelerin sıfır gecikmesi olabilirken, bazılarında çok daha uzun bir gecikme olabilir:
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Delayed.html
Bunu göz önünde bulundurarak, birkaç kullanım durumu düşünebilirim - muhtemelen kırılgan olurlar ve mesajlaşma akışınızla ilgili bir kod kokusu olurlar. Belirli durumlar dışında hepsine alternatifler kullanırdım:
1) Kontrol akışı - bir siparişin işlenmesi 60 saniye sürdüğünü biliyoruz, bu yüzden nesne en az 60 saniye orada olana kadar sıradaki bir sonraki siparişi okumayın.
2) İleti akışı - 2 veya 3 harici hizmete istek gönderdiğimiz ve daha sonra, ilk iş grubunun en azından tamamlanma şansı olacağını bildiğimizde, N saniye sonra siparişi işlemek için bir sonraki görevi serbest bıraktığımız son derece eşzamansız bir sistem . .
3) Mesaj yığınlama - belki belirli bir tipteki siparişler çoğalır, bu yüzden son N saniyede alınan siparişleri işlemeyelim, böylece bir sonraki çalıştırmada toplu olarak işlenebileceğinden kısa bir süre sonra benzer siparişlerin gelip gelmediğini görebiliriz.
4) Mesaj öncelikleri - farklı mesajlar veya farklı müşteriler düşük veya sıfır gecikmeyle biraz daha yüksek kalitede hizmet alabilir.
Bazı durumlarda, bir kuyruğa yerleştirdiğiniz nesnelerin, ayıklanmaya hazır olmadan önce belirli bir süre bu kuyrukta olması gerekir. BlockingQueue arabirimini uygulayan java.util.concurrent.DelayQueue sınıfını burada kullanabilirsiniz. DelayQueue, kuyruk nesnelerinin belirtilen süre boyunca kuyrukta kalmasını gerektirir.
Gerçek dünya kullanımı örneği için bkz . Devx sitesindeki Kuyruğu İşaretleme makalesi
... Bunu resmetmeyi düşündüğüm gerçek dünya örneği (ki bu sizi acıktırabilir) muffin içerir. Muffin nesneleri (Java'dan bahsederken — kahve cezası istenmiyor). Muffin nesnelerini yerleştirdiğiniz bir DelayQueue'niz olduğunu varsayalım ... getDelay yöntemi, nesnenin DelayQueue'da tutulması için ne kadar zaman kaldığını belirtir. Bu yöntemle döndürülen sayı sıfır veya sıfırdan az olduğunda, nesne hazırdır (veya bu örnekte, pişirilir) ve ayıklanmasına izin verilir ...
Tam olarak pişirilmemiş bir Muffin yemek istemediğiniz için, Muffin'yi önerilen pişirme süresi için DelayQueue üzerine yerleştirin ...