2011-11-24 8 views
12

Bloke etme davranışı nasıl özelleştirilir Üreticiyi, sıradaki öğe sayısı yerine özelleştirilmiş kurallara göre engelleyen bir engelleme kuyruğu oluşturmak istiyorum. ÖrneğinBlockingQueue

:

Üretici bazı dosyalar oluşturur ve bir sıraya koyar. Tüketici, bazı analizlerden sonra bunları belirli bir yere aktarır.

Yukarıdaki senaryo için, kuyruğa giren toplam dosyaların boyutu eşik değere ulaşırsa, üreticinin yeni dosyalar üretmeyi beklemesini istiyorum. Kuyruk, toplam boyut eşik değerini geçmediğinde herhangi bir sayıda dosyayı kabul edebilir.

+0

Şimdiye kadar herhangi bir çözüm buldunuz mu? –

+0

Bu çok eski bir soru. Ve henüz herhangi bir gerçek uygulamada engelleme kuyrukları kullanmadım. Bu yüzden bundan sonra bir çözüm aramak için çok uğraşmadım. –

cevap

3

Bunu uygulamak zorunda olacağını düşünüyorum 0.

+0

Bazı metotları veya tahmin edemeyeceği başka bir şeyi geçersiz kılarak engelleme davranışını uyarlamak için java tarafından sağlanan bazı yerleşik mecanizma beklerdim. Çünkü kurallar ihtiyaca göre değiştirilebilir. –

+0

Bu sınıfın nasıl faydalı olabileceğini görebiliyorum. Gereksinimlerinizi anladığımdan emin değilim. Eğer 'take' sıradaki 10 elementi bloke edene kadar bloke edilseydi, o zaman on elementi alabilir miyim, yoksa 9 elementin tekrar 10 olmasını beklemeli miyim? – aioobe

+0

Belirtilen senaryo için, "al" bekleyene kadar beklemez sıra boş. Ancak dosyaların toplam büyüklüğü (** dosya sayısı ** değil) thrashhold değerini geçtiyse 'koy' bekler. Thrashhold değerinin 5mb olduğunu varsayalım, sonra sıra 1000 dosyada 5 KB veya 100 KB (50 resim) olan bir dosya varsa "bekle" bekleyecektir. –

0

ulaşan zaman muhtemelen ArrayBlockingQueue gibi bir BlockingQueue böyle alt sınıf ve eşik değerine başlatıldı ve çeşitli take/remove yöntemlerini sağlayan basit bir CountDownLatch eklersiniz kilitleme mekanizması kendiniz. Bekleme/bildirme veya ReentrantLock/Koşul, birleşik uzunluğu ve dosyaları tutan bir LinkedList tutan uzun bir değişken kullanabilirsiniz.

+0

Bu, @aioobe'nun önerdiği gibi benim çözüm kuyruğumdaki son seçenek. :) –