Ich verwalte eine Bibliothek, die einen Daemon-Thread startet, um im Hintergrund zu arbeiten. In regulären Java- und Android-Anwendungen wird dieser Thread einmal gestartet und wird für die gesamte Lebensdauer des Prozesses ausgeführt. Es geht nie aus und das ist in Ordnung.Beenden eines Threads beim Entladen der App
Wenn meine Bibliothek in einem Anwendungscontainer enthalten ist, der das Entladen von Anwendungen unterstützt (z. B. Tomcat), wird die Anwendung nie entladen. Mein laufender Thread enthält starke Verweise auf seine eigene Klasse und verhindert, dass die gesamte Anwendung entladen wird. Benutzer meiner Bibliothek können ihre App nicht austauschen, ohne dass jedes Mal Speicher verloren geht.
Wie kann ich am besten benachrichtigt werden, wenn der Anwendungscontainer meine Bibliothek entladen möchte?
Dies ist eine kleine Bibliothek ohne Abhängigkeit von Anwendungscontainer-APIs. Es weiß nicht, in welchem Anwendungscontainer es ausgeführt wird und es nicht möchte!
Die Tatsache, dass diese Bibliothek einen Thread startet, ist ein Implementierungsdetail. Endbenutzer der Bibliothek sollten nicht wissen müssen, dass ein Thread gestartet wird, und es liegt nicht in ihrer Verantwortung, sie herunterzufahren.
Gibt es ein anderes Objekt, bei dem Sie die Garbage Collection erkennen könnten? – immibis
Ich bin mir nicht sicher, ob ich dein Problem richtig verstehe, aber vielleicht ist das: https://weblogs.java.net/blog/kcpeppe/archive/2011/09/29/mysterious-phantom-reference hilfreich? –