2012-11-26 9 views
8

Ich habe eine Callable<String>. Ich möchte es regelmäßig über ScheduledExecutorService.scheduleAtFixedRate() ausführen und eine Liste aller Zeichenfolgen erhalten, die von den .call()-Aufrufe auf meiner aufrufbar zurückgegeben wurden. Wie scheduleAtFixedRate nicht nehmen Sie sich ein Callable (nur Runnable s) ich eine benutzerdefinierte ausrollen müssen Runnable, dass meine Callable Wraps, etwas in dieser Richtung:In regelmäßigen Abständen ein Callable über 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); 

Natürlich würde ich meine eigene benutzerdefinierte vermeiden möchten Ausrollen (vor allem im Multi-Threaded-Code), also frage ich mich, ob es eine JDK-Klasse gibt, die diese Art von Aggregation durchführt?

+0

nein, da kein vorhandenes Dienstprogramm in der jdk ist für Sie Callable Ergebnisse in einer Sammlung zu setzen. – jtahlborn

+0

Das habe ich mir gedacht. Vielen Dank. –

Antwort

0

Was Sie oben tun, behandelt Ihre Callable-Implementierung als nur eine weitere normale Klasse. Sie übermitteln die Callable nicht an einen ThreadPool-Executor. Der Aufruf von Callable.call() verwendet den ThreadPoolExecutor nicht.

Sie müssen Ihre Aufgabe (Runnable/Callable/ForkJoinTask, etc ..) an einen ThreadPool senden, um das Thread-Pooling zu nutzen. Sie können die Futures verwenden, um die Ergebnisse nach der Ausführung zu sammeln.

ForkJoinPool ist eine Option, die Sie versuchen können, das ist Teil von JDK 7. Fork die Aufgaben und Join sie mit ForkJoinTask Warum Futures nicht verwenden? Sie sind genau dafür gedacht, den Zustand der Aufgabe und ihr Ergebnis zu kennen.

würden Sie aussehen: Using Callable to Return Results From Runnables

Verwandte Themen