2017-10-12 3 views
3

Hallo ich eine statische Liste verwenden möchten alle laufenden Threads zu halten, wie:statische Liste Mit allen Threads in Java zu halten

public class MyClass { 
    public static final List<Thread> threads = new ArrayList<>(); 
    public static void main(String[] args) throws InterruptedException { 
     new Thread(() -> { 
      MyClass.threads.add(Thread.currentThread()); 
      try { 
       Thread.sleep(2000); 
      } catch (Exception e) { 
      } 
     }).start(); 
     for (int i = 0; i < 10; i++) { 
      if (!threads.isEmpty()) { 
       Thread t = threads.get(0); 
       System.out.println(t.isAlive()); 
      } 
      Thread.sleep(1000); 
     } 
    } 
} 

Der obige Code wird aus

einen Druck geben
true 
true 
false 
false 
... 

Dies ist wie erwartet, da der Thread nach 2 Sekunden zurückkehrt.

Meine Frage ist: verschwindet der Thread, der zu der statischen Liste von Threads hinzugefügt wird, nachdem der Thread zurückgegeben wurde? d. h. erwarte ich, dass das Thread-Objekt in der Liste an einem bestimmten Punkt null wird, nachdem der Thread zurückgegeben wurde? Oder sehe ich das Thread-Objekt auf unbestimmte Zeit? Spielt GC hier eine Rolle?

+3

* verschwindet der der statischen Threadliste hinzugefügte Thread jemals, nachdem der Thread zurückgegeben wurde? * Nur wenn Sie ihn entfernen. –

Antwort

4

Das Thread-Objekt verschwindet nicht auf magische Weise, sobald der zugehörige OS-Thread beendet wird.

Sobald der Thread beendet wird es nicht als GC Wurzel dienen kann, aber solange noch etwas anderes eine Referenz darauf hält, wie Sie Ihre Liste, wird es bleiben, um.

Und es ist egal, ob der Thread gestoppt oder unterbrochen ist oder was auch immer. Der java.lang.Thread ist ein Objekt, das auf eine Systemressource, den eigentlichen Thread, verweist, solange dieser Thread aktiv ist, aber sobald der Thread beendet wird, wird nichts unternommen, um das Objekt zu zerstören. Just isAlive gibt false zurück und Sie können den start nicht mehr starten.

Es ist schwer, sich vorzustellen, was gut es eine Liste von Themen wie zu halten tun, was Sie vorschlagen.

+0

Vielen Dank. Ich füge Threads zur Konstruktion von MyClass hinzu, damit ich weiß, wer eine Instanz davon hat. – user1589188

+1

@ user1589188: Sie würden besser einen Thread-Pool als dedizierte Threads verwenden. –

+0

Danke. Fast perfekte Antwort. Wenn ich jetzt remove anrufe, um den letzten Verweis auf das Thread-Objekt freizugeben, wird GC die vom Thread belegte Ressource wiederverwenden. – user1589188

1

Nein, wird der Faden nicht mehr läuft, aber das Thread Objekt, das Sie halten auf bleiben, genau wie jedes andere Objekt. Der Garbage Collector kann nur Objekte bereinigen, auf die nichts verweist, und Thread Instanzen sind keine Ausnahme.