2012-11-26 12 views
8

Ho un Callable<String>. Voglio eseguirlo periodicamente tramite ScheduledExecutorService.scheduleAtFixedRate() e per ottenere un elenco di tutte le stringhe restituite dalle chiamate .call() sul mio callable. Come scheduleAtFixedRate non ci vuole un Callable (solo Runnable s) ho bisogno di stendere un costume Runnable che avvolge la mia Callable, qualcosa in questo senso:Esegui periodicamente un Callable tramite 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); 

Naturalmente, mi piacerebbe evitare di stendere il mio personalizzato cosa (specialmente nel codice multi-thread), quindi mi chiedo che ci sia una classe JDK che fa questo tipo di aggregazione?

+0

no, non v'è un programma di utilità esistente nel JDK di mettere i risultati Callable in una collezione per voi. – jtahlborn

+0

Questo è quello che pensavo. Grazie. –

risposta

0

Quello che stai facendo è trattare l'implementazione Callable come un'altra normale classe. Non si sta inviando il callable a un esecutore ThreadPool. La chiamata a Callable.call() non utilizza ThreadPoolExecutor.

È necessario inviare il task (Runnable/Callable/ForkJoinTask, ecc.) A un ThreadPool per utilizzare il pool di thread. È possibile utilizzare i Futures per raccogliere i risultati una volta eseguiti.

ForkJoinPool è un'opzione che puoi provare come parte di JDK 7. Gestire le attività e unirle utilizzando ForkJoinTask Perché non utilizzare Futures? Sono esattamente pensati per conoscere lo stato di attività e il suo risultato.

Forse si guarda a questo: Using Callable to Return Results From Runnables

Problemi correlati