Das folgende Stück Code versucht, dies zu begleiten.Graceful Herunterfahren von Threads und Executor
Der Code wird für immer wiederholt und überprüft, ob noch ausstehende Anforderungen verarbeitet werden. Wenn es welche gibt, erzeugt es einen neuen Thread, um die Anfrage zu verarbeiten und sie an den Executor zu übergeben. Sobald alle Threads fertig sind, bleibt es für 60 Sekunden und überprüft erneut auf ausstehende Anforderungen.
public static void main(String a[]){
//variables init code omitted
ExecutorService service = Executors.newFixedThreadPool(15);
ExecutorCompletionService<Long> comp = new ExecutorCompletionService<Long>(service);
while(true){
List<AppRequest> pending = service.findPendingRequests();
int noPending = pending.size();
if (noPending > 0) {
for (AppRequest req : pending) {
Callable<Long> worker = new RequestThread(something, req);
comp.submit(worker);
}
}
for (int i = 0; i < noPending; i++) {
try {
Future<Long> f = comp.take();
long name;
try {
name = f.get();
LOGGER.debug(name + " got completed");
} catch (ExecutionException e) {
LOGGER.error(e.toString());
}
} catch (InterruptedException e) {
LOGGER.error(e.toString());
}
}
TimeUnit.SECONDS.sleep(60);
}
}
Meine Frage ist die meisten der Verarbeitung von diesen Threads erledigt mit Datenbank. Und dieses Programm wird auf einem Windows-Rechner laufen. Was passiert mit diesen Threads, wenn jemand versucht, den Computer herunterzufahren oder sich abzumelden? Wie Sie die laufenden Threads und auch den Executor ordnungsgemäß herunterfahren?
Das ist rückwärts. Unter der Annahme, dass 'ExecutorService' einer der typischen Werte ist, die von' Executors' Factory-Methoden zurückgegeben werden, sind die Backing-Threads Nicht-Daemon-Threads. Der Shutdown-Hook wird erst aufgerufen, wenn diese Threads beendet werden, und das wird erst geschehen, wenn der ExecutorService beendet wird. Ihre Lösung wird nur, wenn die Threads des Executors nicht Daemon sind oder wenn Ihr Programm einen Benutzerinterrupt empfängt. –
Das OP fragt speziell nach dem Fall, in dem die JVM aufgefordert wurde, eine ordnungsgemäße Abschaltung durchzuführen. Unabhängig davon, der Inhalt der Antwort ist korrekt, man braucht dies nur in einem Shutdown Hook zu tun, um den Executor Service früher zu beenden. –
Danke für die Antwort so schnell.Ich glaube, ich habe diesen Teil ihrer Frage übersehen. Können Sie ein drittes '***' hinzufügen, um dieses Bit zu verdeutlichen? –