Bitte helfen Sie zu verstehen, ExecutorService # awaiteTermination (Timeout) Verhalten.Ist awaistTermination in ExecutorService "passiert vor" irgendeinen Code, der danach ausgeführt wird?
Ich beobachte Situation, wenn ich in meinem Code haben:
private void shutdownAndAwaitTermination(ExecutorService threadPool){
threadPool.shutdown();
try {
if (!threadPool.awaitTermination(threadPoolTimeout, TimeUnit.HOURS)){
threadPool.shutdownNow();
if (!threadPool.awaitTermination(60, TimeUnit.SECONDS)) {
logger.warn("Pool did not terminate");
}
}
}
catch (InterruptedException ie) {
threadPool.shutdownNow();
Thread.currentThread().interrupt();
}
}
Ist der Pool in Aufgaben vollständig in diesem Fall vor alle anderen Anrufe nach shutdownAndAwaitTermination() in demselben Thread?
Blick in dem, was auf der Produktion geschieht, glaube ich, dass die Antwort keine, aber ich möchte nur wissen, wie sicher zu stellen, dass jeder Code nach einem Aufruf von shutdownAndAwaitTermination platziert() wird nach letzter Aufgabe passiert in Pool wird vervollständigt.
Danke.
Ich glaube, ich muss threadPool.invokeAll (...) verwenden, um sicherzustellen, dass alle Aufgaben abgeschlossen sind. Erstellt invokeAll() happes-before? –
@MaximGalushka Ja, wenn 'invokeAll()' ohne Ausnahme zurückgibt, wird die gesamte Aufgabenbeendigung 'vor-before' ausgeführt. – erickson
Dank @erickson werde ich das tun. –