2011-10-31 7 views
1

私は、Thread.stop()と他の関数は非難されていることを知っています。特定の条件が満たされている場合、スレッドの実行を停止したいです。ここで私が今やっているの簡易版は、次のとおりです。run()メソッドの内部でJavaスレッドを安全に停止できますか?

public class SomeThread extends Thread 
{ 
    private static boolean running = true; 

    public static void shutdown() 
    { 
     running = false; 
    } 

    public void run() 
    { 
     while(running) 
     { 
      // do something cool 
     } 

     return; // <- this is what I'm wondering about 
    } 
} 

別のクラスは、()メソッド、whileループが終了した後、run()メソッドが返すSomeThreadのシャットダウンを呼び出すとき。これは安全ですか?

私はwhileループを使用している主な理由は、whileループの前に一度しかやりたくないことがいくつかあるためです。スレッドを並行処理に使用します。私はこれがThreadsのためのものの荒廃であると確信していますが、私は主にreturn文について疑問を抱いています。

答えて

4

返品は正常です。残りのコードはiffyです。

メンバーは揮発性であるか、その変数への読み書きのために何らかの同期が必要です。

(静は珍しいようshutdownrunningを持つ。)

+0

私は実際に同期を行っています(上記のコードはそれを反映していませんが)。統計情報を削除し、 "実行中"をvolatileに変更すると、スレッドを安全に保つのに十分でしょうか? (私はこの文脈で静的を使用した理由を覚えていますが、今は指摘しているとは思えません) – WillP

+0

あなたが適切な同期を取る場合は、揮発性。私の意見では、揮発性を正しく使用するのははるかに手間がかかります。 – Mat

+0

マットで同意してください。またはAtomicBooleanを使用すると、さらに簡単にIMOできます。 –

6

ために、スレッド上interrupt()を呼び出し、別のスレッドから、ビルトインのスレッドの割り込みメカニズムの代わりにフィールドの

public class SomeThread extends Thread { 
    public void run() { 
     while(!isInterrupted()) { 
      // do something 
     } 
    } 
} 

を使用しますそれを閉鎖する。これは、スレッドがモニター上で待機していても機能するという追加の利点があります。

+1

ああ、ありがとう。このスレッドのものは私には新しいものです。私はpthreadsとセマフォーにもっと慣れています。 Javaは簡単すぎます。 – WillP

+0

これはより良い回答であり、受け入れられるべきです! –

関連する問題