2017-03-04 20 views
2

私はフィールドとしてThreadを含むクラスを持っていて、クラスがガーベッジ・コレクションを取得するとスレッドは実行され続けますが、これは起こりたくありません。無限に実行中のスレッドをクリーンアップする方法はありますか?

このよう

public class A 
{ 
    Thread thread; 

    public A() 
    { 
     thread = new Thread() { 
      @Override 
      public void run() 
      { 
       while(!isInterrupted()) 
       { 
        //Do work 
       } 
      } 
     }; 

     thread.start(); 
    } 
} 

しかし、Aがなくなったときに、スレッドが住んでいます。私はfinalizeメソッドの使用について読んだことがありますが、それは常に推奨されません。これを処理する正しい方法は何ですか?

答えて

2

ライブスレッドがgarbage collector rootと考えられているので、あなたのAは(Threadを経由して、への参照を保持し、任意のオブジェクトがそうであるように)周りの糸スティックを行った場合であっても。

また、スレッド自体がGCの対象であっても、GCを正常に終了させるのは難しい作業です。

ノートはfinalizeは間違いA、あなたのスレッドがあなたのAインスタンスへの参照を保持するために発生した場合ということも(あります自動的にスレッドを終了する方法は本当にない、と私はfinalizefor various reasonsに対して助言するだろうあなたのAがガベージコレクションされることはありません)。

スレッドが終了したら、スレッドを明示的に終了してください。それはそこで唯一の本当に安全で予測可能なオプションです。

たとえば、あなたがさらされる可能性がありstop()またはfinish()またはスレッドを停止し、あなたがに、たとえば、近いファイルやストリームを持っているだけのように、あなたはそれで行われたときに、それを呼び出すための要件を文書化Aからどんな方法あなたがそれらで済むと、例えばスニペットの建物:

public class A { 

    Thread thread; 

    public A() { 
     thread = new Thread() { 
      @Override public void run() { 
       while(!isInterrupted()) { 
        //Do work 
       } 
      } 
     }; 
     thread.start(); 
    } 

    void stop() { 
     thread.interrupt(); 
     thread.join(); // if you want 
    } 

} 

あなたはAを持っているならば、あなたはまた、クリーンアップのためのtry-with-resourcesを使用することができるというのボーナスを得るAutoCloseableを実装し、close()内のスレッドを停止します。

はまた、ガベージコレクタの動作WRTスレッドに読んで:

+0

ええ、私は手動で停止する方法か何かを呼び出す必要はありませ望んでいたがああましたよく –

+0

@NameMcChangeはい、多少刺激的ですが、Javaのような言語のコースでも同じですので、明るいところでは誰も実際にそれに気を付けません。これはかなり典型的な方法であり、コードの読者に混乱を与えてはなりません。 –

関連する問題