2011-06-14 16 views
9

Yönetici hizmetlerim için oldukça yeni. Her şeyi kendim yapmayı sevdim ama bence bu hizmetlere güvenmenin zamanı geldi.java Callable FutureTask Excecuter: Bitmiş görevi nasıl dinlerim

Executer numaralı telefonu Runnable numarasına vermek istiyorum. Yürütücü bunu FutureTask'da tamamlar ve bana geri gönderir. Şimdi, done() yöntemini çağırıyorum. Ancak o zaman done() yönteminin doğru döndüğü zaman bildirim almak istiyorum.

Runnable tamamlanana kadar bloklayan bir get() yöntemi var, ancak bittiğinde görmek için her iş için fazladan bir iş parçacığına ihtiyacım var.

Görev bitirme hakkında bildirim almak için yöneticime biraz daha fazla Callable verebilir miyim?

Buraya gitmenin yolu nedir? Aynı iplik bunu yapmak için başka bir onun daha iyi ardına görevi yapmak istiyorsanız

cevap

3

... Ben run yönteminin sonuna bazı kod eklemek, ama sonra done() hala yanlış olabilir.

Executor executor = 
final Runnable runnable = 
executor.execute(new Runnable() { 
    public void run() { 
     runnable.run(); 
     // do something after the run() has finished. 
    } 
}); 

aynı öbekte çalıştırılabilir sonra done istediğiniz ve yoklamak veya başka bir iş parçacığı kullanmak gerekmez her ne yapacağız Bu şekilde.

+0

Ayrıca çok iş parçacıklı bir soru var [burada] (http://stackoverflow.com/questions/29130563/how-can-i-terminate-tasks-that-have-timed-out-in-multithreading/). Gelecekteki görevimde iptal etmeyi nasıl kullanacağımı bilmiyorum, bu yüzden sizinle görüşmek istedim. Mümkünse, bana yardım edebilir misin? – john

3

ExecutorCompletionService.

Bir sonraki sürüm (r10) bittiğinde, MoreExecutors.listeningDecorator(ExecutorService) kullanarak ListenableFuture s döndüren bir ExecutorService oluşturmak kolay olacaktır. Şu anda Runnable s/Callable s ürününü kendiniz de ListenableFutureTask numaralı ürüne sarabilirsiniz.

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null); 
executor.submit(task); 
task.addListener(new Runnable() { 
    public void run() { 
    // do whatever 
    } 
}, listenerExecutor); 
+0

Bu, Peter Lawrey'in yaklaşımının karmaşık bir yolu değil. – irreputable

+0

Belki bu dekoratör ile düzgün kod olabilir. V.10 ne zaman geliyor? İndirmek için bazı beta var mı? –

+0

@irreputable: Peter'ın yaklaşımında, görev tamamlandıktan sonra ne yapılacağının ele alınması, idareye sunulan görevin bir parçası olarak toplanır. Görev iptal edildiyse, örneğin, öğrenemezdiniz. Yazıldığı gibi, delegenin 'run()' daki bir istisna da çalışmamasından sonra parçaya neden olur. Artı, sonradan, kendisinin istemediği şeyle aynı iş parçacığına olan şeyleri bağlıyorsunuz. – ColinD