DarthShader
Erfahrenes Mitglied
Hallo zusammen,
ich habe eine einfache, kleine Klasse entwickelt, die von JLabel erbt und die aktuelle Uhrzeit anzeigt. Durch einen ExecutorService wird die aktuelle Uhrzeit abgefragt und dann via "setText" des Labels gesetzt.
Die Klasse sieht so aus:
Meine simple Frage ist nun - wird durch diesen Code ein Memory Leak erzeugt?
Ich habe folgendes Szenario im Kopf:
Ist diese Überlegung korrekt, birgt die Klasse oben also dieses Problem?
Falls ja, wie könnte man es richtig machen?
(Die einfache Lösung, von außen beim Schließen des Parents dann "shutdown" auf dem ExecutorService des Labels aufzurufen, reicht mir nicht. Den Grad an Automatismus würde ich natürlich schon gerne behalten.)
Über Eure Hilfe würde ich mich sehr freuen
Vielen Dank!
ich habe eine einfache, kleine Klasse entwickelt, die von JLabel erbt und die aktuelle Uhrzeit anzeigt. Durch einen ExecutorService wird die aktuelle Uhrzeit abgefragt und dann via "setText" des Labels gesetzt.
Die Klasse sieht so aus:
Java:
public class TimeLabel extends JLabel
{
private static final int INITIAL_UPDATE_DELAY_MS = 2000;
private static final int UPDATE_PERIOD_MS = 5000;
private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
public TimeLabel()
{
updateLabelOnEventDispatchThread();
scheduledExecutorService.scheduleAtFixedRate( new LabelUpdateTask(),
INITIAL_UPDATE_DELAY_MS, UPDATE_PERIOD_MS, TimeUnit.MILLISECONDS );
}
private void updateLabelOnEventDispatchThread()
{
SwingUtilities.invokeLater( new Runnable() {
@Override public void run() {
// TimeUtil ist eine Klasse, die via .format den übergebenen Calendar als String formatiert
setText( TimeUtil.format( Calendar.getInstance(), "dd.MM.yyyy HH:mm" ) );
}
} );
}
private class LabelUpdateTask implements Runnable
{
@Override
public void run()
{
updateLabelOnEventDispatchThread();
}
}
}
Meine simple Frage ist nun - wird durch diesen Code ein Memory Leak erzeugt?
Ich habe folgendes Szenario im Kopf:
- Man fügt dieses Label einem JFrame hinzu
- Während das Programm läuft, wird der JFrame irgendwann mal geschlossen und für den Garbage Collector freigegeben
- Dieser räumt den JFrame, und damit auch alle Komponenten des JFrames weg
- Eigentlich sollte damit auch das TimeLabel vom GC gelöscht werden. Aber dies passiert nicht, weil der ExecutorService ja noch läuft, auf ihm wurde noch kein "shutdown" aufgerufen
Ist diese Überlegung korrekt, birgt die Klasse oben also dieses Problem?
Falls ja, wie könnte man es richtig machen?
(Die einfache Lösung, von außen beim Schließen des Parents dann "shutdown" auf dem ExecutorService des Labels aufzurufen, reicht mir nicht. Den Grad an Automatismus würde ich natürlich schon gerne behalten.)
Über Eure Hilfe würde ich mich sehr freuen
Vielen Dank!
Zuletzt bearbeitet: