SORU
22 EYLÜL 2008, PAZARTESİ


Gelecek< herhangi kadar bekleyin;T> yapılır

Birkaç asenkron çalışan görevleri var ve en az bir tanesi (gelecekte muhtemelen N dışında açıklama beklemek lazım görevleri bitti) tamamlanana kadar beklemek istiyorum. Şu anda Geleceği olarak takdim ediyorlar, şöyle bir şey istiyorum

/**
 * Blocks current thread until one of specified futures is done and returns it. 
 */
public static <T> Future<T> waitForAny(Collection<Future<T>> futures) 
        throws AllFuturesFailedException

Böyle bir şey var mı? Ya da bir şey benzer, Geleceği için gerekli değil. Şu anda ben vadeli toplanması döngü, eğer bittikten sonra bir süre uyku kontrol edin ve tekrar kontrol edin. Bu eğer uzun süre uyursam o zaman istenmeyen gecikme eklenir, kısa süre uyursam o zaman performansını etkileyebilir, çünkü en iyi çözüm gibi görünüyor.

Kullanmayı deneyebilirim

new CountDownLatch(1)

ve görev tamamlandığında geri sayım azaltmak ve yapmak

countdown.await()

eğer Geleceği yaratma ben kontrol ediyorum , ama mümkün buldum. Görevler oluşturma (ExecutorService için Çağrı gönderme) şu anda mantık hangi Gelecek için beklemek karar ayrılır çünkü bu mümkün, ama sistem yeniden gerektirir. Ayrıca geçersiz olabilir

<T> RunnableFuture<T> AbstractExecutorService.newTaskFor(Callable<T> callable)

oluşturma ve özel uygulama RunnableFuture ile yetenek eklemek dinleyici olmak bildirildikten sonra görev tamamlandı, o zaman takmak gibi bir dinleyici için gerekli görevleri ve kullanım CountDownLatch, ama demek zorundayım geçersiz newTaskFor için her ExecutorService kullanıyorum - ve olasılıkla olacak uygulama değil uzatmak AbstractExecutorService. Ayrıca aynı amaç için verilen ExecutorService sarma deneyebilirim, ama sonra tüm yöntemler Vadeli üretim süslemeleri var.

Tüm bu çözümler işe ama çok doğal görünebilir. Basit bir şey kaçırıyorum gibi görünüyor

WaitHandle.WaitAny(WaitHandle[] waitHandles)

c#. Sorun, bilinen çözümleri için böyle mi?

GÜNCELLEME:

Aslında zarif bir çözüm olduğunu hiç bu kadar Gelecek yaratma erişim hiç yoktu. Sistemi yeniden tasarlama sonra Gelecek yaratma erişimi var ve countDownLatch eklemeniz mümkün.() geri sayım yürütme işlemi, daha sonra countDownLatch edebilirim.() bekliyor ve her şey gayet iyi çalışıyor. Diğer cevaplar için teşekkürler, ben bilmiyordum hakkında ExecutorCompletionService ve gerçekten yardımcı olabileceğini benzer görevler, ama bu özel durumda değil, çünkü eskiden bazı Vadeli oluşturulur olmadan herhangi bir varis - gerçek görev için gönderilen başka bir sunucu üzerinden network, uzaktan tamamlar ve tamamlama bildirimi aldı.

CEVAP
22 EYLÜL 2008, PAZARTESİ


basit, ExecutorCompletionService check out.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Smith

    Bryan Smith

    12 Mart 2006
  • Chanre Joubert

    Chanre Joube

    27 Temmuz 2012
  • HereWeStayKings

    HereWeStayKi

    3 NİSAN 2013