2016-05-19 15 views
0

Ich möchte einen gemeinsamen Thread-Pool unter verschiedenen Reader-Objekten verwenden. Jeder Leser liest asynchron mit einem Thread aus dem Pool. Hier ist, wie ich meine Executor definieren:Gemeinsamer Executor-Service unter verschiedenen Worker

public static ExecutorService executor = Executors.newFixedThreadPool(); 

Ich möchte es in TableReader Objekte verwenden. Zum Beispiel gibt es eine Funktion readRows, die wie folgt aussehen:

executor.submit(new AsyncRowReader(...)); 

Aber ich bin nicht sicher, wie die shutdown() Schritt zu behandeln. Der Tablereader ist Teil eines Glases, die wie folgt verwendet werden kann:

TableReader r = new TableReader(...); 
while (not done) { 
    r.readRow(...); 
} 

Es mehrere Objekte Tablereader von einer einzelnen Anwendung sein könnte. Ich kann den Executor-Dienst herunterfahren, sobald alle diese Vorgänge abgeschlossen sind. Wie kann ich erkennen, dass dort keine Aufgaben mehr ausgeführt werden? Gibt es eine andere Art von Thread-Pool, den ich verwenden kann?

+4

Ich glaube, Sie mißverstehen, was Abschaltung der Fall ist. Sie können 'shutdown()' sofort nachdem Sie Ihren letzten Worker gesendet haben und alles wird immer noch beendet. Sie können 'shutdownNow()' verwenden, wenn Sie (über 'Thread # interrupt()') alles, was in diesem Moment läuft, unterbrechen und alles, was sich noch in der Warteschlange befindet, abbrechen wollen. – zapl

+1

@ToyElephant: Schau dir an: http://StackOverflow.com/questions/7939257/wait-until-all-threads-finish-their-work-in-java/36797569#36797569 –

+0

@zapi: Was passiert, wenn ich nicht wissen, wann meine letzte Anfrage eingereicht wurde? Die Anwendung kann viele Leserobjekte öffnen. Leserobjekte haben keine Beziehung zwischen ihnen. Ich möchte nicht, dass die Anwendung damit klarkommt. – ToyElephant

Antwort

0

Klingt wie Sie benötigen einen ExecutorCompletionService:

ExecutorCompletionService completionService = new ExecutorCompletionService(executor); 

while (completionService.poll() != null) { 
    System.out.println("Still working..."); 
} 

executor.shutdown();