2012-11-26 17 views
8

Mam numer Callable<String>. Chcę go uruchamiać okresowo przez ScheduledExecutorService.scheduleAtFixedRate() i otrzymywać listę wszystkich ciągów, które zostały zwrócone przez wywołania .call() na moim żądaniu. Jak scheduleAtFixedRate nie bierze Callable (tylko Runnable s) muszę rozwałkować zwyczaj Runnable która otacza moje Callable, coś wzdłuż tych linii:Okresowe uruchamianie usługi Callable za pośrednictwem usługi ScheduledExecutorService

final Callable<String> myCallable = ....; 
final ConcurrentLinkedQueue<String> results 
    = new ConcurrentLinkedQueue<String>(); 

Runnable r = new Runnable() { 
    @Override public void run() { 
    try { 
     results.add(myCallable.call()); 
    } catch (Exception e) { 
     results.add(null); // Assuming I want to know that an invocation failed 
    } 
    } 
}; 

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 
executor.scheduleAtFixedRate(r, 0, 1, TimeUnit.SECONDS); 

Naturalnie chciałbym uniknąć toczenia moje własne niestandardowe (w szczególności w kodzie wielowątkowym), więc zastanawiam się, czy istnieje klasa JDK, która dokonuje tego rodzaju agregacji?

+0

nie, nie jest istniejącym narzędzie w JDK umieścić wywoływalnym wyniki do kolekcji dla Ciebie. – jtahlborn

+0

Tak myślałem. Dzięki. –

Odpowiedz

0

To, co robisz powyżej, traktuje twoją implementację na żądanie jako kolejną normalną klasę. Nie przesyłasz wywoływacza do executora ThreadPool. Wywołanie funkcji Callable.call() nie powoduje użycia ThreadPoolExecutor.

Musisz przesłać zadanie (Runnable/Callable/ForkJoinTask, etc.) do ThreadPool, aby wykorzystać pulę wątków. Możesz użyć Futures, aby zebrać wyniki po wykonaniu.

ForkJoinPool jest jedną z opcji, którą możesz wypróbować w tej części JDK 7. Rozłóż zadania i dołącz do nich za pomocą ForkJoinTask Dlaczego nie używać kontraktów Futures? Są one przeznaczone wyłącznie do poznania stanu zadania i jego wyniku.

Czy patrzeć na to: Using Callable to Return Results From Runnables

Powiązane problemy