2011-12-20 11 views
1

私は、あるスレッドが4つの他のスレッドをフォークし、その完了を待つプロジェクトに取り組んでいます。フォークスレッドは、いつでもフォークされたスレッドを停止する能力を持つ必要があります。 keepRunnigが公開されてスレッドから新しいスレッドを開始する

class ForkedThread implements Runnable { 
    public boolean keepRunning = true; 
    public void run() { 
     while(keepRunning is true){ 
     //Do the Job 
     } 
    } 
} 

いるので、それが外部からアクセスすることができ、偽行うことができます。 は、私のような何かをした、同じことを達成するために。 私の質問は、keepRunningまたはその罰金の使用を同期する必要がありますか? 第二に、この技術はOKですか?または、ThreadPoolを使用して自分の仕事をしなければなりません。 実際には、ThreadPoolを使用すると、自分のコードの複雑さが増します。助けてください。

答えて

2

単に、揮発性としてkeepRunningを宣言するすなわち

public volatile boolean keepRunning = true; 

、あなたは大丈夫です。 volatileは、変数に複数のスレッドがアクセスし、スレッドセーフにする必要があることをJavaに伝えます。これは実際にブール値では大きな問題ではありませんが、参照やロングでは重要になります。

使用しているテクニックは良い方法です。問題のスレッドを正常終了させることができます。 Javaの新しい並行性ライブラリ(つまりExecutorService)を見れば、より簡単で安全なやり方のようになります。投資価値があります!

+1

これは非常にブーリアンの問題です!さもなければ、JVMは 'keepRunning'を一度自由に読み込み、それが本当であることを確認し、それをローカルキャッシュ(例えばCPU上)に保存し、そこから読み続けることができます。別のスレッドがそれを変更した場合、JVMはキャッシュを更新する義務がありません。永遠に回転することができます。 「揮発性」はそれを防ぎます。これは単なる学問ではない。私は自分のデュアルコアラップトップでそれをかなり簡単に作り出すことができます。 – yshavit

+0

+1 yshavit ...ありがとうございました。 –

0

ExecutorServiceを参照してください。それはまさにこれを行うでしょう。

関連する問題