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
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 Future
s (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.
Nasıl Komisyon görevleri içinde Komisy...
Nasıl birçok alt işlemler ve çıkış kod...
Nasıl bir baskı, bir anahtar için bekl...
Nasıl bütün konuları tamamlamak, Execu...
Nasıl jQuery bir Ajax çağrısı için bek...