Ich stelle diese Frage, weil ich viele Executor-Dienste erstelle und während ich vielleicht bereits irgendwo ein Speicherleck habe, das untersucht werden muss, denke ich, dass eine kürzliche Änderung am folgenden Code es tatsächlich verschlimmert hat, daher versuche ich es um zu bestätigen, was los ist:Ruft ein ExecutorService Garbage Collected ab, wenn der Scope außerhalb des Bereichs liegt?
@FunctionalInterface
public interface BaseConsumer extends Consumer<Path> {
@Override
default void accept(final Path path) {
String name = path.getFileName().toString();
ExecutorService service = Executors.newSingleThreadExecutor(runnable -> {
Thread thread = new Thread(runnable, "documentId=" + name);
thread.setDaemon(true);
return thread;
});
Future<?> future = service.submit(() -> {
baseAccept(path);
return null;
});
try {
future.get();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
} catch (ExecutionException ex) {
throw new RuntimeException(ex);
}
}
void baseAccept(final Path path) throws Exception;
}
Dann wird diese Consumer<Path>
auf einem anderen Thread-Pool mit (meist) genannt N = 2 Fäden, bin ich nicht sicher, ob das relevant ist.
Die Frage ist: Ist die ExecutorService service
den Gültigkeitsbereich verlassen und bekommen Müll gesammelt einmal BaseConsumer#accept
beendet hat?
Ich verstehe das nicht. Warum gibt es einen Executor-Service, wenn Sie trotzdem auf 'future.get()' warten wollen? Der Dienst wird Müll gesammelt, wenn alle laufenden Threads darin aufhören. In Ihrem Fall ist die Ausführung immer synchron, da Sie 'submit()' und mit 'get()' warten. –
@DeepakBala Ich möchte die Ausführung auf einem benannten Thread stattfinden lassen, es hat damit zu tun, dass es leichter zu protokollieren ist. In jedem Fall sollte dieser Code funktionieren. – skiwi
Das ist kein guter Grund, den Overhead des Erstellens eines Executors zu durchlaufen. Ich bestreite nicht, dass dein Code funktioniert. Es wird. Sie sind besser dran, wenn Sie das synchron ausführen und das Protokoll optimieren, um zu schreiben, was Sie wollen. Ja, der Service wird Müll gesammelt werden. In Ihrem Fall besteht kein Zweifel daran, dass die Threads, die vor der Ausführung abgeschlossen werden, den Anwendungsbereich der Methode verlassen. –