2017-10-12 4 views
3

内のすべてのスレッドを維持するために、静的リストを使用してこんにちは、私は同じように、すべての実行中のスレッドを維持するために静的リストを使用したい:Javaの

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); 
     } 
    } 
} 

上記のコードは

true 
true 
false 
false 
... 
のプリントアウトを与えます

これは、2秒後にスレッドが復帰するのと同様に予想されます。

私の質問は:スレッドが返された後にスレッドの静的リストに追加されたスレッドは消えてしまいますか?つまり、リスト内のスレッドオブジェクトが、スレッドが戻った後のある時点でヌルになることを期待していますか?またはスレッドオブジェクトが無限に表示されますか? GCはここで果たしますか?

+3

*スレッドが返された後に消えてしまうスレッドの静的リストに追加されたスレッドは削除されますか?*削除した場合のみ。 –

答えて

4

関連するOSスレッドが終了すると、Threadオブジェクトは魔法のように消えることはありません。

スレッドが終了すると、GCルートとして機能することはできませんが、他のものがあなたのリストのように参照を保持している限り、スレッドは周りを守ります。

スレッドが停止しているかどうかは関係ありません。 java.lang.Threadは、実際のスレッドであるシステムリソースを、そのスレッドが生存している限り、オブジェクトを破棄するために何もしないで終了した時点で参照するオブジェクトです。ちょうどisAliveはfalseを返すので、あなたは正常にstartを呼び出すことはできません。

あなたが提案したもののようなスレッドのリストを維持するのが良いことは想像もつきません。

+0

ありがとうございます。 MyClassの構築時にスレッドを追加して、誰がインスタンスを保持しているかを知るようにします。 – user1589188

+1

@ user1589188:専用のスレッドではなく、スレッドプールを使う方がよいでしょう。 –

+0

ありがとうございます。ほぼ完璧な答え。スレッドオブジェクトへの最終参照を解放するためにremoveを呼び出すと、GCはスレッドの占有しているリソースを再利用しますか? – user1589188

1

いいえ、スレッドは実行されていませんが、保持しているThreadオブジェクトは他のオブジェクトと同じように残ります。ガベージコレクタは参照を持たないオブジェクトのみをクリーンアップでき、Threadインスタンスも例外ではありません。