2009-06-21 10 views
2

Ich habe ein Objekt, das Verweise auf 2 Daemon-Threads enthält. Ich denke über den Eckfall nach, in dem es nicht deinitialisiert wird, also kann ich bestimmen, ob ich einen Finalizer benötige. Die Funktion zum Deinitialisieren beendet die Threads. Ich könnte weitermachen und nur einen Finalizer hinzufügen, aber ich bin neugierig:Garbage Collection eines Objekts, das Verweis auf lebendige Threads enthält

  1. Kann das Objekt erhält Müll gesammelt, während die oben genannten Fäden am Leben sind?

  2. Wenn es Müll sammeln kann, werden die Threads unterbrochen?

Antwort

1

Sie keine Threads auf Finalisierung sollten aufhören, weil
Man sollte nicht make Verhalten der Anwendung abhängig von der Garbage Collection.

Garbage Collection ist sehr in deterministisch:

  • Verschiedene JVMs,
  • verschiedenen JVM-Schalter,
  • verschiedene Betriebssysteme,
  • verschiedene Hardware-Architekturen,
  • verschiedene Hardware-Spezifika (CPU, Kerne, Speicher) ...

Alles wirkt sich auf die Garbage Collection aus.

Also, überdenken Sie einfach Ihr Konzept und geben Sie uns weitere Informationen, warum ein Thread gestoppt werden sollte und wann.

+0

Nun, im Normalfall würde der Benutzer ordnungsgemäß trennen() - und die Threads (die mit I/O befassen) würde gestoppt werden. Ich dachte über den Fall nach, in dem die Trennung nicht richtig gemacht wird. – shikhar

+0

Dann sollten Sie mit gehen, lassen Sie mich nachdenken, ... Keepalive Checks? Nach einem Timeout von "no response" wird der Thread beendet. Weil dies im Vergleich zu GC sehr deterministisch wäre. –

+0

können Sie das ausarbeiten? "keine Antwort" von? Übrigens, hier ist der Code: http://code.google.com/p/commons-net-ssh/source/browse/src/main/java/org/apache/commons/net/ssh/trans/Transport.java # 80 – shikhar