SORU
16 Temmuz 2010, Cuma


Tüm görevleri bitirmek için beklemek nasıl ExecutorService,

ExecutorService tüm görevleri bitirmesini beklemek için en kolay yolu nedir? Benim görevim öncelikle hesaplamalı, sadece işleri çok sayıda, her bir çekirdekte bir çalıştırmak istiyorum. Şu an benim kurulum bu gibi görünüyor:

ExecutorService es = Executors.newFixedThreadPool(2);
for (DataTable singleTable : uniquePhrases)
{   
    es.execute(new ComputeDTask(singleTable));
}
try 
{
    es.wait();
} 
catch (InterruptedException e) 
{
    e.printStackTrace();
}

ComputeDTask çalıştırılabilir uygular. Bu görevleri doğru bir şekilde yürütmek için görünür, ancak kod IllegalMonitorStateException wait() üzerine çöker. Bu etrafında bazı oyuncak örnekleri ile oynadım ve işe çıktı, çünkü çok garip.

uniquePhrases elementler binlerce birkaç on içerir. Başka bir yöntem kullanarak olmalıdır? Mümkün olduğunca basit bir şey arıyorum

CEVAP
17 Temmuz 2010, CUMARTESİ


En basit yaklaşım, tek-liner olarak ne istediğinizi yapar ExecutorService.invokeAll() kullanmaktır. Senin dilinde, veya ComputeDTask değiştir sarmak için biraz daha fazla esneklik verebilir Callable<>, uygulamak gerekir. Muhtemelen app Callable.call() ama burada onu sarmak için bir yol varsa Executors.callable() kullanarak anlamlı bir uygulama var.

ExecutorService es = Executors.newFixedThreadPool(2);
List<Callable<Object>> todo = new ArrayList<Callable<Object>>(singleTable.size());

for (DataTable singleTable: uniquePhrases) { 
    todo.add(Executors.callable(new ComputeDTask(singleTable))); 
}

List<Future<Object>> answers = es.invokeAll(todo);

Diğerleri belirttiği gibi, Eğer uygunsa invokeAll() zaman aşımı sürümünü kullanabilirsiniz. Bu örnekte, answers null dönecektir Futures (Executors.callable() tanımına bakın. bir sürü içeren gidiyor Muhtemelen ne yapmak istiyorsun faydalı bir cevap, ya da ComputeDTask ama senin örneğinden anlatamam temel bir başvuru almak için bu yüzden hafif bir yeniden düzenleme.

Eğer açık değil ise, invokeAll() tüm görevler tamamlanana kadar dönecektir unutmayın. (yani, answers toplama **20 s sorulursa .isDone() bildirir.) Eğer istenirse manuel kapatma, awaitTermination, vb tüm engeller... ve bunu yeniden kullanmak için izin verir ExecutorService birbirine bitişik birden fazla döngüleri için.

BÖYLECE birkaç ilgili bir soru var

Bunların hiçbiri noktasında kesinlikle soru için, ama Millet 24*/ExecutorService *kullanılması gerektiğini düşünüyorum hakkında biraz renk veriyorlar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Doug Bernards

    Doug Bernard

    7 Kasım 2007
  • Eddie Bravo

    Eddie Bravo

    17 EKİM 2006
  • Keith Anthe

    Keith Anthe

    26 NİSAN 2011